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

相關問題