Ошибка, которую я не могу понять, как исправить

#asp.net-mvc #asp.net-mvc-3

#asp.net-mvc #asp.net-mvc-3

Вопрос:

Я получаю эту ошибку и не могу понять, что я здесь сделал не так.

Это ошибка:

Элемент модели, переданный в словарь, имеет тип ‘System.Data.Objects.ObjectQuery`1[System.Web.Mvc.SelectListItem]’, но для этого словаря требуется элемент модели типа ‘MyProject.Models.cosmetic’.

Это то, что я ввел в свой контроллер :

 public ActionResult Create(string company_id)
{
    IEnumerable<SelectListItem> items = _enteties.companies.Select(x => new SelectListItem()
    {
        Value = x.company_id,
        Text = x.company_id
    });

    return View(items);

}

[AcceptVerbs (HttpVerbs.Post)]
public ActionResult Create([Bind(Exclude = "ID")]cosmetic cosmeticToCreate ,company  companyToCreate)
{
    if (!ModelState.IsValid)
        return View();

    try
    {
        _repository.Create(cosmeticToCreate,companyToCreate);
        return  RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}
  

Это мое мнение (пожалуйста, обратите внимание, что у меня есть coametic.model)

 @model SrT2.Models.cosmetic

@{
    ViewBag.Title = "Create";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Create</h2>

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>

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

    <div class="editor-label">
        @Html.LabelFor(model => model.brand)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.brand)
        @Html.ValidationMessageFor(model => model.brand)
    </div>
    @Html.DropDownListFor(model => model.company_id, new SelectList(ViewData["items"] as IEnumerable<SelectListItem>,"Value","Text"))
 @*    @Html.DropDownListFor(model => model.company_id, ViewData["items"] as SelectList)*@

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

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

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

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

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

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

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

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

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

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

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

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

Любой совет?

Это ошибка: этому свойству нельзя присвоить нулевое значение. Описание: Необработанное исключение возникло во время выполнения текущего веб-запроса. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.

Сведения об исключении: System.Data.ConstraintException: Этому свойству нельзя присвоить нулевое значение.

Ошибка источника:

Строка 3081: Oncompany_idChanging (значение); Строка 3082: ReportPropertyChanging («company_id»); Строка 3083: _company_id = StructuralObject.SetValidValue(значение, false); Строка 3084: ReportPropertyChanged («company_id»); Строка 3085: Oncompany_idChanged();

Это код, который я использовал :

 public ActionResult Create(string company_id)
     {

         var model = new SrT2.Models.cosmetic();
         //There is No "model.CompanyId " so i have Pass model.cpmpany_id 
         model.company_id =  company_id;
         return View(model);

     }


    [AcceptVerbs (HttpVerbs.Post)]
   public ActionResult Create([Bind(Exclude = "ID")]cosmetic cosmeticToCreate ,company  companyToCreate)
   {

       if (!ModelState.IsValid)
           return View();

       try
       {

           _repository.Create(cosmeticToCreate,companyToCreate);
          return  RedirectToAction("Index");
       }
       catch
       {

           return View();
       }

   }
  

Любой совет? Идея?

Ответ №1:

Вот демонстрация того, как заставить это работать…

 public ActionResult Create(string company_id)
{
    var model = new SrT2.Models.cosmetic();
    model.CompanyId = company_id;

    return View(model);

}
  

Если в представлении Create ожидается, что в качестве модели будет передан «косметический» параметр, вам нужно убедиться, что это то, что вы делаете в своем контроллере…

Вы можете добавлять что-то в модель перед ее передачей, но это должен быть правильный тип.

Надеюсь, это вернет вас в нужное русло.

Ответ №2:

Все сказано вашей ошибкой и кодом. _enteties.companies.Select возвращает Generic ObjectQuery , который вы непосредственно передаете для просмотра. Но в вашем представлении говорится, что он должен получать тип SrT2.Models.cosmetic , а не ObjectQuery или даже IEnumerable