невозможно добавить данные из выпадающего списка в таблицу - PullRequest
0 голосов
/ 22 марта 2012

Я использую nhibernate и mvc3 в asp.net Я пытаюсь добавить данные в таблицу, где моя схема таблицы выглядит следующим образом:

 public class HobbyMasters
{
    [Key]
    public virtual int HobbyId { get; set; }

    [Required(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = "NameRequired")]
    public virtual string HobbyName { get; set; }

    public virtual HobbyTypes HobbyType { get; set; }
    [Required]
    public virtual string HobbyDetails { get; set; }
    [Required]
      public virtual ICollection<HobbyMasters> HobbyNames { get; set; }
}
  public class HobbyTypes
{
    [Key]
    public virtual int HobbyTypeId { get; set; }
    [Required]
    public virtual string HobbyType { get; set; }
           public virtual ICollection<HobbyTypes> Hobby { get; set; }
}

в моем контроллере

   public ActionResult Create()
    {
         ViewBag.c1 = (ICollection<HobbyTypes>)(new Hobby_MasterService().GetAllHobbyTypes());
         return View();
    } 

    //
    // POST: /Hobbies/Create
          [HttpPost]
    public ActionResult Create(HobbyMasters hobby)
    {
        ViewBag.c1 = (ICollection<HobbyTypes>)new Hobby_MasterService().GetAllHobbyTypes();
        try
        {
            if (ModelState.IsValid)
            {
                new Hobby_MasterService().SaveOrUpdateHobby(hobby);
                return RedirectToAction("Index");
            }
       }
   }

в представлении:

 @using (Html.BeginForm("Create", "Hobbies", FormMethod.Post))
 {
  @Html.ValidationSummary(true)
  <fieldset> 

    <legend>Hobby Master</legend>

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

    <div class="editor-label">
    @Html.LabelFor(model => model.HobbyType)
    </div>
    <div class="Editor-field">
   @Html.DropDownListFor(model =>model.HobbyType.HobbyTypeId, new SelectList(ViewBag.c1, "HobbyTypeId", "HobbyType"), "-- Select --")
 @Html.ValidationMessageFor(model => model.HobbyType)

    </div>

     <div class="editor-label">
        @Html.LabelFor(model => model.HobbyDetails)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.HobbyDetails)
        @Html.ValidationMessageFor(model => model.HobbyDetails)
    </div>
 </fieldset>
 <p><input type="Submit" value="Create" /> </p>
  }

Очевидно, я обнаружил, что My Modelstate.IsValid всегда ложно ..... так как он хранит только HobbyId и получает Hobby Type как нуль объект HobbyMasters hobbytype ..... не знаю, где я иду не так, может быть в выпадающем списке или что-то еще ..... Пожалуйста, помогите мне как можно скорее: (

1 Ответ

1 голос
/ 22 марта 2012

Есть несколько проблем с вашим кодом:

  • Во-первых, вы украсили свойство коллекции HobbyNames атрибутом [Required].Вы должны использовать этот атрибут только для простых свойств.Фактически вы можете оставить свойство, но оно не будет иметь абсолютно никакого эффекта

  • Вторая проблема с вашим кодом состоит в том, что вы украсили строковое свойство HobbyType модели HobbyTypesатрибут [Required], но вы никогда не используете это свойство в своем представлении.Поэтому при отправке формы значение не отправляется, а ваша модель недействительна.

  • Другая проблема с вашим кодом заключается в том, что вы привязали раскрывающийся список к свойству model => model.HobbyType.HobbyTypeId.Но HobbyTypeId - это не обнуляемый тип.И все же вы сделали в своем раскрывающемся списке значение по умолчанию: "-- Select --".Это невозможно.Если вы хотите иметь выпадающий список с дополнительным значением, вы должны привязать его к свойству nullable в вашей модели.

Я попытался немного очистить ваш код.

Модель:

public class HobbyMasters
{
    public virtual int HobbyId { get; set; }

    [Required]
    public virtual string HobbyName { get; set; }

    public virtual HobbyTypes HobbyType { get; set; }

    [Required]
    public virtual string HobbyDetails { get; set; }

    public virtual ICollection<HobbyMasters> HobbyNames { get; set; }
}

public class HobbyTypes
{
    [Required]
    public virtual int? HobbyTypeId { get; set; }

    public virtual string HobbyType { get; set; }

    public virtual ICollection<HobbyTypes> Hobby { get; set; }
}

Контроллер:

public class HomeController : Controller
{
    public ActionResult Create()
    {
        ViewBag.c1 = (ICollection<HobbyTypes>)(new Hobby_MasterService().GetAllHobbyTypes());
        var model = new HobbyMasters();
        return View(model);
    } 

    //
    // POST: /Hobbies/Create
    [HttpPost]
    public ActionResult Create(HobbyMasters hobby)
    {
        if (ModelState.IsValid)
        {
            try 
            {
                new Hobby_MasterService().SaveOrUpdateHobby(hobby);
                return RedirectToAction("Index");
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", ex.Message);
            }
        }

        ViewBag.c1 = (ICollection<HobbyTypes>)new Hobby_MasterService().GetAllHobbyTypes();
        return View(hobby);
    }
}

Вид:

@model HobbyMasters

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <fieldset> 
        <legend>Hobby Master</legend>

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

        <div class="editor-label">
        @Html.LabelFor(model => model.HobbyType)
        </div>
        <div class="Editor-field">

        @Html.DropDownListFor(model => model.HobbyType.HobbyTypeId, new SelectList(ViewBag.c1, "HobbyTypeId", "HobbyType"), "-- Select --")
        @Html.ValidationMessageFor(model => model.HobbyType.HobbyTypeId)

        </div>

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

    <p><input type="Submit" value="Create" /></p>
}

Также я очень настоятельно рекомендую вам использовать модели представления.Не передавайте свои доменные объекты своим представлениям.Определить вид модели.

...