#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