2013-02-20 2 views
1

ПРИМЕЧАНИЕ. Код обновлен, чтобы принять во внимание комментарии и ответы, сделанные ниже.Проверка подлинности модели всегда возвращает значение false с помощью выпадающего списка

В моем приложении MVC мне иногда нужно ссылаться на другие объекты (например, отношения «многие ко многим» или отношения «один ко многим»).

Так у меня есть эта модель:

public class ObjInfo 
    { 
     [Required(ErrorMessage = "Obj ID is required.")] 
     [Display(Name = "ObjID")] 
     public int m_Id { get; set; } 

     [Required(ErrorMessage = "Obj Name is required.")] 
     [Display(Name = "Obj Name")] 
     public string m_Name { get; set; } 

     [Display(Name = "Obj Number")] 
     public int m_Number { get; set; } 

     (...) 

     [Required(ErrorMessage = "Other Obj is required.")] 
     [Display(Name = "OtherObj")] 
     public int m_OtherObjID { get; set; } 

     public OtherObjInfo m_OtherObj { get; set; } 

     (...) 
    } 

У меня есть по умолчанию и параметры конструктора, а также и может показать их по мере необходимости, хотя я не уверен, что они виноваты. Так или иначе.

В моем контроллере, у меня есть два создание методов следующих MVC методы:

 // 
     // GET: /Obj/Create 

     public ActionResult Create() 
     { 
      ViewBag.List = new SelectList(PopulateDDLs(), "OtherObj", "Other obj ID"); 
      return View(); 
     } 

     // 
     // POST: /Obj/Create 

     [HttpPost] 
     public ActionResult Create(Objinfo obj) 
     { 
      if (ModelState.IsValid) 
      { 
       m_ObjManager.CreateObj(obj); 
       return RedirectToAction("SearchIndex"); 
      } 

      ViewBag.List = new SelectList(PopulateDDLs(), "OtherObj", "Other obj ID"); 
      return View(obj); 
     } 

И, наконец, вот как мои "Создать" вид закодирован:

@model MyApp.Models.ObjInfo 

@{ 
    ViewBag.Title = "Create"; 
} 

<h2>Create</h2> 

@using (Html.BeginForm()) { 
    @Html.ValidationSummary(true) 

    <fieldset> 
     <legend>OBJ</legend> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.m_Id) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.m_Id) 
      @Html.ValidationMessageFor(model => model.m_Id) 
     </div> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.m_Name) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.m_Name) 
      @Html.ValidationMessageFor(model => model.m_Name) 
     </div> 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.m_Number) 
     </div> 
     <div class="editor-field"> 
      @Html.EditorFor(model => model.m_Number) 
      @Html.ValidationMessageFor(model => model.m_Number) 
     </div> 

     (...) 

     <div class="editor-label"> 
      @Html.LabelFor(model => model.m_OtherObj , "Other Obj") 
     </div> 
     <div class="editor-field"> 
      @Html.DropDownList(model => model.m_OtherObjID, ViewBag.List as SelectList, "--- Select Other Obj ---", new {@class = "OtherObjInfo "}) 
      @Html.ValidationMessageFor(model => model.m_OtherObj) 
     </div> 

     <p> 
      <input type="submit" value="Create" /> 
     </p> 
    </fieldset> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

@section Scripts { 
    @Scripts.Render("~/bundles/jqueryval") 
} 

В принципе, проблема заключается в том, что каждый раз, когда я нажимаю кнопку «Создать», валидация ModelState всегда ложна для OtherObj, даже если что-то выбрано в раскрывающемся списке. Все остальные значения верны, кроме этого.

Я не понимаю, почему, и я был бы очень признателен за вашу помощь в этом, спасибо за вашу помощь!

После кода отредактированный **

Теперь я получаю аварии, как я вхожу в "Создать" вид:

DataBinding: 'System.String' does not contain a property with the name 'OtherObj'. 

Именно на линии, где находится мой dropdownlistfor.

Предполагается, что данные datavalueField и dataTextField относятся к тому, что именно?

+1

В чем разница между вашим помощником выпадающего списка и другими помощниками? –

+0

Err, нет, в настоящее время он отображает имя OtherObj (если я правильно понял ваш вопрос) – hsim

+0

вам не приходило, что у каждого другого помощника есть ** Для ** в этом разница? –

ответ

1

добавить otherObjectId к модели

public class ObjInfo 
{ 
    public int m_Id { get; set; } 

    ... 

    [Required(ErrorMessage = "Other Obj is required.")] 
    [Display(Name = "OtherObj")] 
    public int otherObjectId { get; set; } 

    public OtherObjInfo m_OtherObj { get; set; } 

    ... 

} 

контроллер

public ActionResult Create() 
{ 
    ViewBag.List = new SelectList(PopulateDDLs(), "Id", "Name"); 
    return View(); 
} 

[HttpPost] 
public ActionResult Create(Objinfo obj) 
{ 
    if (ModelState.IsValid) 
    { 
     m_ObjManager.CreateObj(obj); 
     return RedirectToAction("SearchIndex"); 
    } 

    ViewBag.List = new SelectList(PopulateDDLs(), "Id", "Name"); 
    return View(obj); 
} 

вид

<div class="editor-label"> 
    @Html.LabelFor(model => model.m_OtherObj , "Other Obj") 
</div> 
<div class="editor-field"> 
    @Html.DropDownListFor(model => model.otherObjectId, ViewBag.List as SelectList, "--- Select Category ---", new { @class = "some_class" }) 
    @Html.ValidationMessageFor(model => model.m_OtherObj) 
</div> 

лучший способ использует сильно типизированные хелперы. Все ваши помощники: strongly-typed (editorfor, textboxfor, dropdownlistfor, ...), кроме выпадающего списка.

Если вы хотите связать DDL-значение с вашей моделью, вы должны использовать dropdownlistfor вместо dropdownlist.

Ваше состояние модели недопустимо, потому что вы не связываете требуемое значение как DDL для модели.

+0

Я попробую это, я верну вам результаты. – hsim

+2

о человеке, дайте ему шанс учиться;) –

+1

+1. это шанс учиться :) –

Смежные вопросы