gpt4 book ai didi

asp.net-mvc - DropDownListFor 未绑定(bind)到具有重复项目的编辑 View (List)

转载 作者:行者123 更新时间:2023-12-02 11:21:10 26 4
gpt4 key购买 nike

事情是这样的。我有一个编辑 View ,当我打开它时,它不会绑定(bind)下拉列表的值。

    [NonAction]
public List<SelectListItem> VraagType() {
List<SelectListItem> l = new List<SelectListItem>();
SelectListItem a = new SelectListItem();
SelectListItem b = new SelectListItem();

a.Text = "Meerkeuze";
a.Value = "M";

b.Text = "Open";
b.Value = "O";

l.Add(a);
l.Add(b);

return l;
}

[NonAction]
public List<SelectListItem> getSchalen() {
return _db.EvalSchaals.ToList().ToSelectList(q => q.Sch_Naam, q => q.Sch_ID.ToString(), q => q.Sch_ID == -1).ToList();
}

public ActionResult Edit(int id) {
ViewData["vraagtype"] = VraagType();
ViewData["schaal"] = getSchalen();

EvalVragenBlok evb = _db.EvalVragenBloks.First(q => q.Vrbl_ID == id);
List<EvalVragen> ev = _db.EvalVragens.Where(q => q.Vrbl_ID == id).ToList();

FlatEvalVragenBlok fevb = Mapper.Map<EvalVragenBlok, FlatEvalVragenBlok>(evb);
fevb.Vragen = new List<FlatEvalVragen>();

return View(fevb);
}

这是来自 Controller 的代码。

这是 Edit.aspx View 中的代码

        <h2>
Edit</h2>
<% using (Html.BeginForm()) {%>
<%: Html.ValidationSummary(true) %>
<fieldset>
<legend>Fields</legend>
<legend>Fields</legend>
<div class="editor-label">
<%: Html.LabelFor(model => model.Vrbl_Titel) %>
</div>
<div class="editor-field">
<%: Html.TextBoxFor(model => model.Vrbl_Titel) %>
<%: Html.ValidationMessageFor(model => model.Vrbl_Titel) %>
</div>
<div class="editor-label">
<%: Html.LabelFor(model => model.Sch_ID) %>
</div>
<div class="editor-field">
<%: Html.DropDownListFor(model => model.Sch_ID, ViewData["schaal"] as List<SelectListItem>, "Selecteer een schaal...") %>
<%: Html.ValidationMessageFor(model => model.Sch_ID) %>
</div>
<%= Html.ValidationMessageFor(model => model.Vragen) %>
<table id="vragentbl">
<tr>
<th>
</th>
<th>
Vraag
</th>
<th>
Soort
</th>
</tr>
<% if (Model.Vragen != null) { %>
<% for (int i = 0; i < Model.Vragen.Count; i++) { %>
<tr>
<td>
<%=i + 1%>
</td>
<td>
<%= Html.TextBoxFor(model => model.Vragen[i].Evvr_Vraag, new { style = "width:400px" })%><br />
<%= Html.ValidationMessageFor(model => model.Vragen[i].Evvr_Vraag)%>
</td>
<td>
<%= Html.DropDownListFor(model => model.Vragen[i].Evvr_Type, ViewData["vraagtype"] as List<SelectListItem>, new { style = "width:95px" })%><br />
<%= Html.ValidationMessageFor(model => model.Vragen[i].Evvr_Type)%>
</td>
</tr>
<% }
} %>
<tr>
<td>
</td>
<td>
<a id="addnew" href="#">Voeg extra keuze toe</a>
</td>
<td>
</td>
</tr>
</table>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
<% } %>

我有 2 个列表。其中 1 个位于表单的非重复部分(Schalen),另一个(VraagType)位于重复部分内。

对于 Schalen 来说,一切都很好。我打开编辑 View ,所有字段都按应有的方式填写。 Vrbl_Titel 有它的值,Sch_ID 的下拉列表有它从我随 View 发送的对象接收的值,该对象来自数据库。

问题出在重复部分。model.Vragen[i].Evvr_Vraag 的文本框获取其值,并显示 model.Vragen[i].Evvr_Type 的下拉列表,但是,此下拉列表获取发送的值物体。它保留默认标准值,即“选择列表”中的第一项

我如何从我的“Vragen”对象中获取我的值,并将其放入下拉列表中。如果我将值放入一个简单的文本框中

<%= Html.TextBoxFor(model => model.Vragen[i].Evvr_Type)%>

然后文本框确实获得了值。所以问题是下拉值不会改变它的初始值...MVC 中的错误?

仅供引用,这是对象发送到 View 的方式:

        namespace MVC2_NASTEST.Models {

public partial class FlatEvalVragenBlok {
public int Vrbl_ID { get; set; }
public int Sch_ID { get; set; }
public string Vrbl_Titel { get; set; }
public List<FlatEvalVragen> Vragen { get; set; }
}
}

namespace MVC2_NASTEST.Models {

public partial class FlatEvalVragen {
public int Evvr_ID { get; set; }
public int Vrbl_ID { get; set; }
public int Evvr_rang { get; set; }
public string Evvr_Vraag { get; set; }
public char Evvr_Type { get; set; }
}
}

最佳答案

看来这确实是一个错误,或者至少是 ASP.NET MVC 2 中的不一致。我检查了它的源代码,发现从 TextBoxFor() 帮助器调用的 InputHelper() 方法接收使用计算的默认值

ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData).Model

但是从 DropDownListFor() 帮助程序调用的 SelectInternal() 方法仅接收使用 ExpressionHelper.GetExpressionText() 方法找到的控件的名称。

因此 SelectInternal() 尝试使用 MVC 1 中的 ViewData.Eval() 方法查找默认值。众所周知,该方法无法通过数字索引从数组中提取值。

所以在你的情况下适用

<%: Html.DropDownListFor(model => model.Sch_ID) %>
<%= Html.TextBoxFor(model => model.Vragen[i].Evvr_Type)%>

但不是

<%: Html.DropDownListFor(model => model.Vragen[i].Evvr_Type) %>

因为它相当于

<%: Html.DropDownList("Vragen[" + i + "].Evvr_Type") %>

同时我想再次强调一下

<%= Html.TextBoxFor(model => model.Vragen[i].Evvr_Type)%>

不等于

<%= Html.TextBox("model.Vragen[" + i + "].Evvr_Type")%>

因为后者即使在 MVC 2 中也无法绑定(bind)默认值。

可能的解决方法

第一。由于 SelectInternal() 还会检查 ModelState 字典,因此您可以在返回 View 之前填充此字典。

for (int i=0; i < fevb.Vragen.Count(); i++)
ModelState.Add("Vragen[" + i + "].Evvr_Type", new ModelState
{
Value = new ValueProviderResult(fevb.Vragen[i].Evvr_Type, null,
CultureInfo.CurrentCulture)
});

这将在发布后由 MVC 本身完成,因此您应该仅在第一次手动执行此操作。

第二。而不是

<%= Html.DropDownListFor(model => model.Vragen[i].Evvr_Type, 
ViewData["vraagtype"] as List<SelectListItem>)%>

使用

<%= Html.DropDownListFor(model => model.Vragen[i].Evvr_Type, 
new SelectList(ViewData["vraagtype"] as IEnumerable, "Value", "Text",
Model.Vragen[i].Evvr_Type))%>

ViewData["vraagt​​ype"] 在这种情况下不必包含 SelectListItem 的对象,任何 IEnumerable 就足够了。有需要的可以查看SelectList()方法说明。

关于asp.net-mvc - DropDownListFor 未绑定(bind)到具有重复项目的编辑 View (List<T>),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3501498/

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