2

问题一旦明确提供的值:当有一个使用default "select something" label,那么这个标签只会是一个页面上的DropDownListForASP.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

enter image description here

这是正确的:当你运行该项目下面,然后加载。

现在追加/index/any-value的URL,下面则负载:

enter image description here

这也是正确的。

现在删除/index/any-value以导航回到第一页。以下负载:

enter image description here

这是不正确的。

关闭浏览器窗口,运行网络服务器。
打开不同的浏览器并导航到相同的地址。注意到不正确的事情再次加载,即使这是一个不同的浏览器。

可能一文不值,这并不似乎是一个浏览器缓存的问题,因为:

  • 在控制器的方法禁用与OutputCache缓存什么也不做,和
  • 预选值在HTML实际上来自服务器:

    enter image description here

现在重新启动网络服务器,观察(select one)再次出现......但直到您导航到具有值的页面为止。

ModelState.Clear()添加到控制器没有帮助。

什么确实有助于是设置空模型PropertyThatComesFromDropdownstring.Empty,而不是让它null。然后它可以跨页面正常工作,但它不像是一个适当的解决方案。

这是预期的行为和停止它的正确方法是什么?

+0

这是否存储在会话中?我知道你展示了一个缩小的测试用例,但是因为这是跨浏览器引起另一个“混乱”。 https://msdn.microsoft.com/en-us/library/ms178208(v=vs.110).aspx – Patrick

+0

@Patrick这是ASP.NET MVC,而不是Webforms。总之,不,我没有使用'Session'或cookies。响应中也没有cookie。 – GSerg

+0

这就是我使用的ASP.Net MVC,包括Core。尽管使用浏览器,服务器仍会缓存某些内容,因为它知道它是同一个用户。我认为你的方法在这里不合理。 – Patrick

回答

0

什么帮助是空的模型 PropertyThatComesFromDropdown设置的String.Empty,而不是让它 空。然后,它可以跨页面正常工作,但不会像 适当的解决方案。

它可能很好,它将取决于完整的代码。

我不会称之为黑客,但是由于您看到了这个跨浏览器,如果这一行内容修复了它,我会称之为“正确”解决方案。

+0

显示完整的代码。 'model.PropertyThatComesFromDropdown = string.Empty'在控制器中的'model = new Models.TestModel();'之后,这是唯一的改变。它感觉不对,因为a)模型来自数据库,其值正确地为null; b)因为在提交时模型联编程序将无论如何将所有空字符串解析为空值。 – GSerg

+0

要创建一个测试项目,看看我能做什么,给我几个:) – Patrick

+0

@GSerg Framework版本? – Patrick

相关问题