问题一旦明确提供的值:当有一个使用default "select something" label,那么这个标签只会是一个页面上的DropDownListFor
ASP.NET MVC 5 DropDownListFor没有当空模型传递后
如果服务器尚未提供包含列表中另一个值的页面,则使用此选项。
如果有,“选择某物”标签将不会出现,并且即使当前模型的值为空时,也会预先选择以前的服务值。
我设法减少它到下面的测试案例。
一个标准的MVC 5项目,与标准的NuGet包:
<package id="Antlr" version="3.5.0.2" targetFramework="net45" />
<package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net45" />
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net45" />
<package id="WebGrease" version="1.6.0" targetFramework="net45" />
,并没有别的(没有JavaScript的,没有风格,没有捆绑)。
TestModel:
public class TestModel
{
private static readonly List<SelectListItem> m_PossiblePropertyValues = new List<SelectListItem>()
{
// Explicitly specifying Value and Selected here just to be extra sure
new SelectListItem(){ Text = "Option one", Value = "Option one", Selected = false },
new SelectListItem(){ Text = "Option two", Value = "Option two", Selected = false }
};
public string PropertyThatComesFromDropdown { get; set; }
public List<SelectListItem> PossiblePropertyValues
{
get { return m_PossiblePropertyValues; }
}
}
的HomeController:
public class HomeController : Controller
{
public ActionResult Index(string id)
{
Models.TestModel model = null;
if (string.IsNullOrWhiteSpace(id))
{
// Empty model, for the user to fill
model = new Models.TestModel();
}
else
{
// Existing model, for the user to edit
model = new Models.TestModel() { PropertyThatComesFromDropdown = "Option two" };
}
return View(model);
}
}
查看/主页/ Index.cshtml:
@model DropDownTestProject.Models.TestModel
@Html.DropDownListFor(m => m.PropertyThatComesFromDropdown, Model.PossiblePropertyValues, "(select one)")
<h3>Debug values</h3>
<p>Is the model null? @(Model == null)</p>
<p>Is the property value null? @(Model == null ? "N/A" : (Model.PropertyThatComesFromDropdown == null).ToString())</p>
<p>Is the property valus empty? @(Model == null ? "N/A" : (Model.PropertyThatComesFromDropdown != null && Model.PropertyThatComesFromDropdown == string.Empty).ToString())</p>
<p>What is the property value? @(Model == null ? "N/A" : (Model.PropertyThatComesFromDropdown == null ? "<null>" : Model.PropertyThatComesFromDropdown == string.Empty ? "<empty>" : Model.PropertyThatComesFromDropdown))</p>
现在,在项目属性设置网络 - 开始行动至use "Specific Page" and leave the field blank。
这是正确的:当你运行该项目下面,然后加载。
现在追加/index/any-value
的URL,下面则负载:
这也是正确的。
现在删除/index/any-value
以导航回到第一页。以下负载:
这是不正确的。
关闭浏览器窗口,运行网络服务器。
打开不同的浏览器并导航到相同的地址。注意到不正确的事情再次加载,即使这是一个不同的浏览器。
可能一文不值,这并不似乎是一个浏览器缓存的问题,因为:
现在重新启动网络服务器,观察(select one)
再次出现......但直到您导航到具有值的页面为止。
将ModelState.Clear()
添加到控制器没有帮助。
什么确实有助于是设置空模型PropertyThatComesFromDropdown
到string.Empty
,而不是让它null
。然后它可以跨页面正常工作,但它不像是一个适当的解决方案。
这是预期的行为和停止它的正确方法是什么?
这是否存储在会话中?我知道你展示了一个缩小的测试用例,但是因为这是跨浏览器引起另一个“混乱”。 https://msdn.microsoft.com/en-us/library/ms178208(v=vs.110).aspx – Patrick
@Patrick这是ASP.NET MVC,而不是Webforms。总之,不,我没有使用'Session'或cookies。响应中也没有cookie。 – GSerg
这就是我使用的ASP.Net MVC,包括Core。尽管使用浏览器,服务器仍会缓存某些内容,因为它知道它是同一个用户。我认为你的方法在这里不合理。 – Patrick