UpdateModel не обновляет мою модель

У меня должно быть что-то неправильно настроено, так как я не могу получить функцию UpdateModel для корректного обновления моей модели на основе информации, передаваемой через FormCollection.

Мой взгляд выглядит так:

@model NSLM.Models.Person
@{
    ViewBag.Title = "MVC Example";
}
<h2>My MVC Model</h2>
<fieldset>
    <legend>Person</legend>
    @using(@Html.BeginForm())
    {
        <p>ID: @Html.TextBox("ID", Model.ID)</p>
        <p>Forename: @Html.TextBox("Forename", Model.Forename)</p>
        <p>Surname: @Html.TextBox("Surname", Model.Surname)</p>
        <input type="submit" value="Submit" />
    }  
</fieldset>

Моя модель:

    namespace NSLM.Models
    {
        public class Person
        {
            public int ID;
            public string Forename;
            public string Surname;
        }
    }

и мой контроллер:

        [HttpPost]
        public ActionResult Details(FormCollection collection)
        {
            try
            {
                // TODO: Add update logic here                
                Models.Person m = new Models.Person();

                // This doesn't work i.e. the model is not updated with the form values
                TryUpdateModel(m);

                // This does work 
                int.TryParse(Request.Form["ID"], out m.ID);
                m.Forename = Request.Form["Forename"];
                m.Surname = Request.Form["Surname"];

                return View(m);
            }
            catch
            {
                return View();
            }
        }

как вы можете видеть, если я вручную назначаю каждое свойство, оно работает нормально, так что я не установил, чтобы модель обновлялась со значениями формы?

Спасибо,

отметка

3 ответа

Решение

Замените поля свойствами в вашей модели, а именно:

namespace NSLM.Models
{
    public class Person
    {
        public int ID {get; set;}
        public string Forename {get; set;}
        public string Surname {get; set;}
    }
}

К тому времени, когда вызов достигает метода действия, автоматическое связывание модели уже выполнено. Попробуйте изменить входной параметр вашего метода действия, чтобы принять экземпляр Person. В этом случае механизм связывания попытается создать экземпляр и заполнить его значениями, переданными вашей формой.

Попробуй это:

Посмотреть:

@model NSLM.Models.Person
@{
    ViewBag.Title = "MVC Example";
}
<h2>My MVC Model</h2>
<fieldset>
    <legend>Person</legend>
    @using(@Html.BeginForm())
    {
         @Html.HiddenFor(model => model.ID)

        <p>Forename: @Html.EditorFor(model => model.Name)
            @Html.ValidationMessageFor(model => model.Name)
        </p>
        <p>Surname: @Html.EditorFor(model => model.Surname)
            @Html.ValidationMessageFor(model => model.Surname)
        </p>
        <input type="submit" value="Submit" />
    }  
</fieldset>

Контроллер:

[HttpPost]
public ActionResult Details(Person p)
{
    if (ModelState.IsValid)
    {
        db.Entry(p).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(p);
}
Другие вопросы по тегам