0

我做了一個EditorTemplate在MVC 4與此代碼:EditorTemplate下拉得到錯誤的ID和不能得到驗證

@model Drexx.Models.Account 
@Html.DropDownListFor(model => model.LevelId, (IEnumerable<SelectListItem>)ViewBag.LevelId, String.Empty) 

我查看了此代碼:

@Html.EditorForModel(); 

我的模型有這樣的代碼:

[UIHint("LevelDropDown")] 
[DisplayName("Level")] 
public int LevelId { get; set; } 
public virtual Level Level { get; set; } 

我的控制器有這個代碼的獲取:

ViewBag.LevelId = new SelectList(db.Level, "Id", "Name"); 

我的控制器有這樣的代碼中郵:

ViewBag.LevelId = new SelectList(db.Level, "Id", "Name", account.LevelId); 

這是源代碼的樣子,當我運行它:

<select data-val="true" data-val-number="The field Level must be a number." data-val-required="Feltet Level skal udfyldes." id="LevelId_LevelId" name="LevelId.LevelId"> 
    <option value=""></option> 
    <option value="1">Normal</option> 
    <option value="2">Admin</option> 
</select> 
<span class="field-validation-valid" data-valmsg-for="LevelId" data-valmsg-replace="true"></span> 

爲什麼它使下拉的ID爲「LevelId_LevelId」並將名稱改爲「LevelId.LevelId」? 下拉工作並顯示它應該,但驗證不工作,因爲id /名稱是錯誤的。驗證將突出顯示下拉列表,但不會顯示錯誤消息。

下拉工作完全正常之前我把它變成EditorTemplate /前我開始使用EditorForModel

進出口新的EditorTemplates所以也很難搞清楚什麼可能導致此。

回答

0

我找到了解決方案。

型號應該是這樣的:

[DisplayName("Level")] 
[UIHint("LevelId")] 
[Required] 
public int? LevelId { get; set; } 

的EditorTemplate應該是這樣的: 「?」

@model int? 
@Html.DropDownListFor(model => model, (IEnumerable<SelectListItem>)ViewBag.LevelId, String.Empty) 

這是非常重要的,我把在int之後,因爲我在下拉列表中有一個默認值。

我沒有必須爲下拉菜單創建一個ViewModel。

這是源如何結束脩正以後尋找:

<div class="editor-field"> 
    <select data-val="true" data-val-number="The field Level must be a number." data-val-required="Feltet Level skal udfyldes." id="LevelId" name="LevelId"> 
     <option value=""></option> 
     <option value="1">Normal</option> 
     <option value="2">Admin</option> 
    </select> 
    <span class="field-validation-valid" data-valmsg-for="LevelId" data-valmsg-replace="true"></span> 
</div> 

感謝所有的建議達林季米特洛夫,但他們沒有爲我工作。

0

這裏似乎有些混亂。您已使用指向LevelDropDown.cshtml編輯器模板的UIHint屬性修飾了LevelId整數屬性,但您的編輯器模板似乎強烈鍵入Drexx.Models.Account模型,該模型不正確。

讓我們舉一個例子說明如何實現這一點。一如往常,在ASP.NET MVC你開始通過設計視圖模型,該模型將包含您的觀點可能需要必要的屬性:

public class AccountViewModel 
{ 
    [DisplayName("Level")] 
    public int LevelId? { get; set; } 

    public IEnumerable<SelectListItem> Levels { get; set; } 
} 

那麼你就寫一個控制器的動作,將填充此視圖模型,並把它傳遞給視圖:

public ActionResult Index() 
{ 
    var model = new AccountViewModel(); 
    model.LevelId = 123; // some value that you want to be used to preselect some element of the dropdown 
    model.Levels = new SelectList(db.Level, "Id", "Name"); 

    return View(model); 
} 

,然後在相應的視圖:

@model AccountViewModel 
... 
@Html.EditorForModel() 

然後在~/Views/Shared/EditorTemplates/AccountViewModel.cshtml

@model AccountViewModel 
@Html.DropDownListFor(x => x.LevelId, Model.Levels, string.Empty) 

您也可以指定模板的名稱的可能性:

@Html.EditorForModel("Foo") 

將被尋找~/Views/Shared/EditorTemplates/Foo.cshtml模板。

當你有一些更復雜的父視圖模型時,可以使用UIHint屬性。例如:

public class MyViewModel 
{ 
    UIHint("LevelDropDown") 
    public AccountViewModel Account { get; set; } 

    ... 
} 
+0

如果我的editortemplate沒有帳戶,我應該怎麼強制輸入?不能看到你做什麼不同,除了你不使用ViewBag。 – DrexxDK

+0

您的編輯器模板是強類型的帳戶,但您將UIHint屬性放置在整數屬性上。另外,因爲我沒有使用ViewBag,所以我有兩個不同名稱的不同名稱,這是正確的方法。在你的ViewBag案例中,你有一個'ViewBag.LevelId',它應該保存一些集合,另一方面你有一個名字完全相同的'LevelId'屬性,它是一個整數。 –

+0

如果我把UIHint放在「public AccountViewModel Account」上,我得到這個:「Attribute'UIHint'在這個聲明類型上是無效的,它只對'property,indexer,field'聲明有效。如果我把UIHint放在「public virtual Level Level {get; set;}」我得到「傳入字典的模型項目的類型是'System.Int32',但是這個字典需要一個'Drexx.Models'類型的模型項目。帳戶'。」我也得到了它「public int levelId {get; set;}」 – DrexxDK