Данные пустые в методе Post asp.net mvc 2 - PullRequest
0 голосов
/ 23 октября 2010

Я пытаюсь отобразить классы, которые имеют свойства типа некоторого пользовательского класса внутри него. Модель:

public class ComplexParent
{
    public SimpleChild First { get; set; }
    public SimpleChild Second { get; set; }
} 
public class SimpleChild
{
    public int Id { get; set; }
    public string ChildName { get; set; }
    public string ChildDescription { get; set; }
}

Контроллер:

public ActionResult Testify(int id)
    {
        ComplexParent par = new ComplexParent();
        par.First = new SimpleChild() { Id = id };
        par.Second = new SimpleChild()
        {
            Id = id + 1,
            ChildName = "Bob",
            ChildDescription = "Second"
        };

        return View("Testify", par);
    }

    [HttpPost]
    public ActionResult Testify(ComplexParent pComplexParent)
    {

        return View("Testify", pComplexParent);
    }

Вид:

<% using (Html.BeginForm())
   {%>
<fieldset>
    <legend>Fields</legend>
    <%: Html.EditorFor(x => x.First) %>
    <br />
    <%: Html.EditorFor(x => x.Second.ChildName)%>
    <br/>
    <br/>
    <br/>
    <% Html.RenderPartial("SimpleChild", Model.First); %>
    <p>
        <input type="submit" value="Watch me :-)" />
    </p>
</fieldset>
<% } %>

Когда дело доходит до Get it работает просто отлично, я вижу все данные. Но на посту параметр pComplexParent является пустым (оба свойства сложного класса равны нулю). Возможно, я что-то здесь упускаю, но не смог заставить это работать ... Небольшое дополнение: просмотр части, которая показывает только редактор для имени, делает Second child не нулевым, а имя установлено в Bob. Но я не понимаю, как сделать это только с помощью методов EditorFor или DisplayFor.

ОБНОВЛЕНИЕ: Спасибо Дарину Димитрову, который любезно просмотрел весь мой код и нашел причину этой проблемы. Точная проблема заключалась в том, что если вы используете шаблон отображения, asp.net mvc 2 не отправляет никаких значений обратно, и если весь шаблон не имеет ничего для отправки, объект является нулевым. Я все еще думаю о том, как получить данные, даже если вы не хотите их редактировать. Но использование шаблона редактора делает вещь, и у меня все объекты теперь заполнены правильными данными.

1 Ответ

2 голосов
/ 23 октября 2010

Ваш взгляд немного беспорядок.Вы используете шаблоны редактора вместе с частями для первого ребенка.Не очень понятно, какие поля включены в форму.Я бы порекомендовал вам использовать только шаблоны редактора:

Модель:

public class ComplexParent
{
    public SimpleChild First { get; set; }
    public SimpleChild Second { get; set; }
}
public class SimpleChild
{
    public int Id { get; set; }
    public string ChildName { get; set; }
    public string ChildDescription { get; set; }
}

Контроллер:

[HandleError]
public class HomeController : Controller
{
    public ActionResult Testify(int id)
    {
        var par = new ComplexParent();
        par.First = new SimpleChild() { Id = id };
        par.Second = new SimpleChild()
        {
            Id = id + 1,
            ChildName = "Bob",
            ChildDescription = "Second"
        };

        return View(par);
    }

    [HttpPost]
    public ActionResult Testify(ComplexParent pComplexParent)
    {
        return View(pComplexParent);
    }
}

Вид:

<% using (Html.BeginForm()) { %>
    <%: Html.EditorFor(x => x.First) %>
    <%: Html.EditorFor(x => x.Second) %>
    <input type="submit" value="Watch me :-)" />
<% } %>

Шаблон редакторадля SimpleChild (~/Views/Home/EditorTemplates/SimpleChild.ascx):

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SomeNs.Models.SimpleChild>" %>

<%: Html.HiddenFor(x => x.Id) %>
<%: Html.EditorFor(x => x.ChildName) %>
<%: Html.EditorFor(x => x.ChildDescription) %>

Теперь, если вы хотите иметь разные шаблоны редактора для двух дочерних свойств, вы можете указать имя шаблона редактора при его включении:

<%: Html.EditorFor(x => x.First, "FirstChildEditor") %>

, что соответствует ~/Views/Home/EditorTemplates/FirstChildEditor.ascx или используйте атрибут [UIHint] в вашей модели:

public class ComplexParent
{
    [UIHint("FirstChildEditor")]
    public SimpleChild First { get; set; }
    public SimpleChild Second { get; set; }
}

Моя рекомендация: , а не , чтобы использовать Html.RenderPartial длягенерирование полей ввода, потому что их имена будут жестко закодированы и не будут привязаны должным образом в зависимости от иерархии объектов.

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