ASP.NET MVC Ошибка в HttpPost Create - нулевые значения, переданные в модель после POST - проблема привязки модели? - PullRequest
0 голосов
/ 01 февраля 2011

У меня проблема с тем, что должно быть очень простым ASP.NET MVC Create методом.

После того, как я заполню данные и отправлю форму в представлении Создать (и все правила валидации пройдены), экземпляр модели, переданный методу POST, будет содержать значения NULL или 0 для каждого поля и ModelState..IsValid вернет false.

Я использую Firebug для проверки параметров формы POST, и действие submit, очевидно, опубликовало все параметры из полей.Однако эти параметры не привязаны к модели, передаваемой методу POST в Контроллере, следовательно, модель (а именно материал в коде) содержит нулевые значения во всех полях (как проверено с использованием Watch и точек останова, помещенных в начале POST).method).

Параметры POST из Firebug:

Content-Type: application/x-www-form-urlencoded Content-Length: 228 MaterialNoMass.MaterialNoMassID=9mmPlasterboard&MaterialNoMass.RoughnessTypeID=3&MaterialNoMass.Resistance=0.0560&MaterialNoMass.ThermalAbsorptance=0.09&MaterialNoMass.SolarAbsorptance=0.07&MaterialNoMass.VisibleAbsorptance=0.07

Создание представления:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Database.Master"
 Inherits="System.Web.Mvc.ViewPage<MvcDeepaWebApp.ViewModels.DatabaseSimpleMaterialViewModel>" %>
    <asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
        <% Html.EnableClientValidation(); %>
        <% using (Html.BeginForm())
           {%>
        <%: Html.ValidationSummary(true) %>
        <fieldset>
            <legend>Create MaterialNoMass</legend>
            <%: Html.EditorFor(model => model.MaterialNoMass, new { RoughnessTypes = Model.RoughnessTypes })%>
            <p>
                <input type="submit" value="Save" />
            </p>
        </fieldset>
        <% } %>
        <div>
            <%: Html.ActionLink("Back to List", "Index") %>
        </div>
    </asp:Content>

GET и POST методы Create в контроллере:

    //
    // GET: /DatabaseSimpleMaterial/Create
    public ActionResult Create()
    {
        var viewModel = new DatabaseSimpleMaterialViewModel
        {
            MaterialNoMass = new MaterialNoMass(),
            RoughnessTypes = deepaDB.RoughnessTypes.ToList()
        };

        return View(viewModel);
    }

    //
    // POST: /DatabaseSimpleMaterial/Create

    [HttpPost]
    public ActionResult Create(MaterialNoMass material)
    {
        if (ModelState.IsValid)
        {
            MaterialAllType mt = new MaterialAllType();
            mt.MatID = material.MaterialNoMassID;
            mt.MatTypeID = deepaDB.MaterialTypes.Single(type => type.MatType == "SimpleMaterial").MatTypeID;
            material.MatTypeID = mt.MatTypeID;

            deepaDB.AddToMaterialAllTypes(mt);

            deepaDB.AddToMaterialNoMasses(material);

            deepaDB.SaveChanges();
            return RedirectToAction("Index");
        }

        //Error occurred
        var viewModel = new DatabaseSimpleMaterialViewModel
        {
            MaterialNoMass = material,
            RoughnessTypes = deepaDB.RoughnessTypes.ToList()
        };

        return View(viewModel);
    }

К вашему сведению, всякий раз, когда создается новый MaterialNoMass, новый экземпляр MaterialAllType также должен создаваться с использованием того же идентификатора MaterialNoMass.Я еще даже не достиг стадии изменения базы данных, поскольку привязка модели, кажется, не работает.

Я использовал аналогичный подход Create в других контроллерах в приложении, и все они работают нормально, за исключениемэтот контроллер.Последние два дня мне было трудно отлаживать это.Пожалуйста, помогите!

1 Ответ

1 голос
/ 01 февраля 2011

Проблема заключается в том, что модель, которую вы передаете представлению, имеет значение DatabaseSimpleMaterialViewModel и внутри ожидаемого действия POST MaterialNoMass.Поэтому убедитесь, что вы используете правильный префикс:

[HttpPost]
public ActionResult Create([Bind(Prefix="MaterialNoMass")]MaterialNoMass material)

Я полагаю, что шаблон вашего редактора генерирует такие поля:.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...