如何从 Ajax.BeginForm 发布完整的 DropDownList,而不仅仅是 selectedId

How to Post full DropDownList from Ajax.BeginForm instead of just the selectedId

提问人:Mangesh 提问时间:8/22/2011 最后编辑:Mangesh 更新时间:8/22/2011 访问量:1230

问:

//Model
public class SelectModel
{
    public string CategoryId { get; set; }
    public List<SelectListItem> List { get; set; }
}

//ViewModel
public class ViewModel
{
    public SelectModel SelectMod { get; set; }
}

//OnIndex call
@Html.Partial("ViewUserControl1", Model.SelectMod)

//ViewUserControl1.cshtml
@model MvcApplication4.Models.SelectModel
<div id="formid">
    @using (Ajax.BeginForm("Index1", "Home", new AjaxOptions { UpdateTargetId = "formid" }, new { id = "TheForm" }))
    { 
        @Html.DropDownListFor(x => x.CategoryId, Model.List, "--Select One--")
        <input type="submit" name="name" value="Submit" />
    }
</div>

//Controller
 public ActionResult Index1(SelectModel sm)
 {
     return PartialView("ViewUserControl1", sm);
 }

因此,现在当您发布 Ajax.BeginForm 时,我们得到的是表单的 selectedId,而不是 FULL DROPDOWN LIST。 如果我有很多下拉列表,我需要使用完整的下拉列表再次创建sm。 有没有办法我可以将整个下拉列表发送到控制器并返回相同的列表。

更新:AjaxOptions 中不应该有一个参数,它允许我们发布页面的完整列表(如果需要)以及 selectedIds。

C# ASP.NET-MVC-3 剃刀 不显眼的 JavaScript

评论

0赞 balexandre 8/22/2011
你能再解释一下你想要整个下拉列表吗?+还不够吗?idvalue
0赞 Mangesh 8/22/2011
当我们提交表单时,可能会显示验证错误,但为此我们需要再次绘制部分页面。该页面可能包含下拉列表。您将如何填充下拉列表。如果 sm 不包含 List,则不会绘制它。
0赞 Mangesh 8/22/2011
另一个示例可能是登录部分 Page.It 具有用户名、密码和状态,以选择是否在页面上出现错误,以返回带有状态的页面下拉列表。我知道我们可以用ajax来做到这一点,但这只是一个例子。

答:

1赞 Arjan Einbu 8/22/2011 #1

简短的回答是否定的!由于 HTML 中的下拉列表不会返回其所有成员,而只返回选定的成员。

更长的答案是,ASP.NET WebForms 允许您执行您要求的操作,并且您可以通过创建类似于 ViewState 的机制来重新创建其中的一些 ASP.NET WebForms。

ASP.NET WebForms 的作用是将列表中的所有值存储在页面中两次。既在要显示的列表中,又在名为 ViewState 的隐藏字段中复制。然后,隐藏字段在提交时发送回服务器,并用于重新填充下拉列表。

你可以模仿 WebForms 在 MVC 中使用的相同行为 ASP.NET 方法是以某种方式序列化你的集合并将其放在一个隐藏的字段中。然后,在提交时,可以将隐藏字段中的数据反序列化回集合中,并使用它来填充下拉列表。