問題一旦明確提供的值:當有一個使用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