Свойства модели MVC 2, не используемые в представлении, возвращаются как нулевые или пустые - PullRequest
3 голосов
/ 16 марта 2011

У меня возникает проблема, когда я передаю заполненный объект представлению, которое не отображает все свойства.

public ActionResult Edit(Guid clientID)
{
    Property property = PropertyModel.GetPropertyDetails(clientID);
    return View("Edit", "Site", property);
}

Представление:

<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage<WebFrontend.ViewModels.Property>" %>

<% using (Html.BeginForm())
   {%>
    <%: Html.ValidationSummary(true, "Property update was unsuccessful. Please correct the errors and try again.") %>

    <fieldset>
        <legend>Edit Account: <%: Model.ClientAccountNo %></legend>

         <div class="editor-label">
            <%: Html.LabelFor(model => model.ClientName)%>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.ClientName)%>
            <%: Html.ValidationMessageFor(model => model.ClientName)%>
        </div>

        <p>
            <input type="submit" value="Update Property" />
        </p>
    </fieldset>

<% } %>

При отправкеобъект Property передается в этот метод контроллера, но все свойства, не используемые в представлении, являются нулевыми или пустыми, включая Model.ClientAccountNo, который присутствует в представлении перед отправкой.

[HttpPost]
    public ActionResult Edit(Property property)
    {
        if (ModelState.IsValid)
        {
            bool success = PropertyModel.UpdateProperty(property);
            if (success)
            {
                // property has been updated, take them to the property details screen.
                return RedirectToAction("Details", "Property", new { clientID = property.ClientID });
            }
            else
            {
                ModelState.AddModelError("", "Could not update property.");
                return View("Activate", "Site", property);
            }
        }
        // If we got this far, something failed, redisplay form
        return View("Edit", "Site", property);
    }

Я не могу найтичто-нибудь подобное в Интернете, любое объяснение того, почему это происходит и как это исправить, будет оценено.

Ответы [ 2 ]

2 голосов
/ 16 марта 2011

Так работает MVC - он пытается создать объект типа параметра действия из значений в маршруте, форме и строке запроса. В вашем случае он может получить только значения из коллекции форм. Он ничего не знает о значениях, которые вы сохранили в своей базе данных.

Если вас интересуют только определенные свойства, вам лучше использовать конкретную модель представления, включив только эти свойства, - тогда вы можете выполнить проверку для этого конкретного случая.

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

0 голосов
/ 16 марта 2011

Поскольку вы не передаете неиспользуемые свойства в URL, вам придется отображать скрытые поля для них.Используйте метод Html.HiddenFor.

...