gpt4 book ai didi

c# - ASP.NET MVC 呈现模型不是我期望的方式

转载 作者:太空狗 更新时间:2023-10-29 23:41:16 26 4
gpt4 key购买 nike

今天我遇到了一个问题,我无法理解我对 ASP.NET MVC(可能还有一般的 MVC)的理解有误,或者我错过了它的实现。

所以,我有一个简单的模型层次结构:

public class Child
{
public Child(int notId, bool isSelected, string text)
{
NotId = notId;
IsSelected = isSelected;
Text = text;
}

public Child(){}

// naming: just to make sure I do not mess with some
// conventional infrastructure
public int NotId { get; set; }
public bool IsSelected { get; set; }
public string Text { get; set; }
}

public class Parent
{
public List<Child> Children { get; set; }
}

这是我的 HomeController 的编辑操作:

[HttpGet]
public ActionResult Edit()
{
var parent = new Parent
{
Children = new List<Child>
{
new Child(1, true, "a"),
new Child(2, false, "b")
}
};
return View(parent);
}

[HttpPost]
public ActionResult Edit(Parent parent)
{
parent.Children = new List<Child>
{
new Child(4, false, "c"),
new Child(5, true, "d")
};
return View(parent);
}

Hese 是我的 Edit.aspx View :

<!-- Standart HTML elements ommited --> 
<% Html.BeginForm(); %>
<% for (var i = 0; i < Model.Children.Count; i++){%>
<div>
<%=Html.LabelFor(m => m.Children[i].IsSelected)%>
<%=Html.EditorFor(m => m.Children[i].IsSelected)%> <!-- lamda -->
<%=Html.CheckBoxFor(m => m.Children[i].IsSelected)%> <!-- lamda -->
<%=Html.CheckBox("A", Model.Children[i].IsSelected)%> <!-- simple -->
</div>
<% } %>

<input type="submit" value="Submit" />
<% Html.EndForm();%>

要点是,在 Edit (HttpGet) 方法中,我创建了 Parent 实例,其中有两个子 Child 元素具有它们的 IsSelected 属性分别设置为 truefalse。在 Edit (HttpPost) 方法中提交表单后,我为我的 Parent 对象提供了一个包含两个 Child 元素及其 IsSelected 的新子集合 属性分别设置为 falsetrue(与 HttpGet 方法相反)并调用 View() 方法来呈现我的模型.

但我在提交后得到的是复选框,使用 Html.EditorFor()Html.CheckBoxFor() 渲染不会改变它们的状态。看起来 Html.EditorFor()Html.CheckBoxFor() 方法不是从我的模型中获取数据,而是从发布的表单数据中获取数据。

有人可以向我解释这里发生了什么以及为什么 ASP.NET MVC 拒绝呈现我的模型吗?解决方法?修复了我的代码?

提前致谢。

附言我注意到 MVC2 中的这种行为,并认为这是某种错误,但是当我用 MVC3 测试它时,它做了同样的事情。

最佳答案

But what I get after submit is checkboxes, rendered with Html.EditorFor() and Html.CheckBoxFor() do not changes their state. It looks like Html.EditorFor() and Html.CheckBoxFor() methods take data NOT from my model but from a posted form data.

这正是他们所做的,而且是设计使然。 Html 助手在绑定(bind)值时首先查看模型状态,然后查看模型。如果您想更改此行为,您可以从您打算在 Controller 操作中修改的模型状态中删除所有项目:

[HttpPost]
public ActionResult Edit(Parent parent)
{
ModelState.Remove("Children");
parent.Children = new List<Child>
{
new Child(4, false, "c"),
new Child(5, true, "d")
};
return View(parent);
}

关于c# - ASP.NET MVC 呈现模型不是我期望的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7612518/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com