@ Html.ListBox()和@ Html.DropDownList()如何在asp.net mvc中保持状态?

时间:2016-10-22 18:39:23

标签: c# asp.net asp.net-mvc

控制器:

public class HomeController : Controller
            {
                //
                // GET: /Home/
                public ActionResult Index()
                {   
                    return View();
                }
                [HttpPost]
                public ActionResult Index(string list1)
                {
                    return View();
                }


            }

查看(使用默认布局):

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

@using (Html.BeginForm())
{

    @Html.DropDownList("list1",
                        new SelectList(new[] { "Item 1", "Item 2", "Item 3" }))

    <input type="submit"/>
}
<br />
<br />

在DropDownList中选择值并提交表单后,我的应用程序具有与之前相同的状态。例如,如果我在按“提交”后选择了“项目3”,则我选择了“项目3”。它是如何工作的?

UPD:

我不想避免它,只是想了解它的工作原理。

2 个答案:

答案 0 :(得分:2)

[Post]处理程序中,您不会在任何地方重定向并直接返回视图。因此,值仍然存在,因为它们仍然在模型状态中找到。

成功[Get]后,常见模式是redirectPost处理程序,在这种情况下,值不会持续存在。

答案 1 :(得分:0)

来自MVC来源:

<强> SelectExtensions.cs:

.....
    object defaultValue = (allowMultiple) ? htmlHelper.GetModelStateValue(fullName, typeof(string[])) : htmlHelper.GetModelStateValue(fullName, typeof(string));
.....

<强> HtmlHelper.cs:

internal object GetModelStateValue(string key, Type destinationType)
        {
            ModelState modelState;
            if (ViewData.ModelState.TryGetValue(key, out modelState))
            {
                if (modelState.Value != null)
                {
                    return modelState.Value.ConvertTo(destinationType, null /* culture */);
                }
            }
            return null;
        }

嗯,这意味着Action发送“ModelState”来查看和控制(我知道它的定义不正确)使用“ModelState”来填充它们自己。