При попытке добавить новый элемент в базу данных (используя EF 6.1.3 и MVC 5) моя модель всегда передается как null. Вот модель:Модель передается как null
using System.ComponentModel.DataAnnotations;
using System.Web;
namespace AccessorizeForLess.ViewModels
{
public class AddNewProductViewModel
{
public string Name { get; set; }
[DataType(DataType.MultilineText)]
public string Description { get; set; }
public decimal Price { get; set; }
public string AltText { get; set; }
public int Quantity { get; set; }
public string ImagePath { get; set; }
public HttpPostedFileBase Image { get; set; }
}
}
Вот способ создать в контроллере (я знаю, что это convuluted, но я буду работать над этим)
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create([Bind(Include="ProductImageId,ProductName,ProductPrice,Quantity,ProductDescription")] AddNewProductViewModel model)
{
ProductImageViewModel image = new ProductImageViewModel() { ImagePath = "/Content/ProductImages/" + model.Image.FileName, AltText = model.AltText };
ProductImage newImage = new ProductImage() { ImagePath = image.ImagePath, AltText = image.AltText };
entities.ProductImages.Add(newImage);
await entities.SaveChangesAsync();
int ImageId = newImage.ProductImageId;
Product product = new Product()
{
ProductImageId = ImageId,
ProductName = model.Name,
ProductDescription = model.Description,
ProductPrice = model.Price,
Quantity = model.Quantity
};
string file = model.Image.FileName;
string path = @"/Content/ProductImages/";
model.Image.SaveAs(path + file);
if (ModelState.IsValid)
{
entities.Products.Add(product);
await entities.SaveChangesAsync();
return RedirectToAction("Index");
}
ViewBag.ProductImageId = new SelectList(entities.ProductImages, "ProductImageId", "ImagePath", product.ProductImageId);
return View("Index");
}
И вид:
@model AccessorizeForLess.ViewModels.AddNewProductViewModel
@{
ViewBag.Title = "Add New Product";
Layout = "~/Views/Shared/_Layout.cshtml";
}
@using (Html.BeginForm("Create", "Products", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
<h4>Product</h4>
<hr />
@Html.ValidationSummary(true)
<div class="form-group">
@Html.LabelFor(model => model.ImagePath, "Image", new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.TextBoxFor(model => model.ImagePath, new { @type = "file" })
@Html.ValidationMessageFor(model => model.ImagePath)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.AltText, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.AltText)
@Html.ValidationMessageFor(model => model.AltText)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Name, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Price, new { @class = "control-label col-md-2" ,@width = "25px"})
<div class="col-md-10">
@Html.EditorFor(model => model.Price)
@Html.ValidationMessageFor(model => model.Price)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Quantity, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Quantity)
@Html.ValidationMessageFor(model => model.Quantity)
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Description, new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Description, new { @cols = "25", @rows = "55" })
@Html.ValidationMessageFor(model => model.Description)
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}
<div>
@Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
Что я делаю неправильно?
EDIT @Stephen, когда я попытался запустить его снова, чтобы ответить на ваш вопрос, я получаю это
И понятия не имею, что это, вы видели что-нибудь подобное раньше?
EDIT
Ошибка
Описание: Произошла ошибка во время компиляции ресурса, необходимого для обслуживания этого запроса. Ознакомьтесь с приведенными ниже конкретными данными об ошибках и соответствующим образом измените исходный код.
Compiler Error Message: CS1520: Method must have a return type
Source Error:
Line 641: #line default Line 642: #line hidden Line 643:BeginContext("~/Views/Products/Create.cshtml", 2361, 9, true); Line 644: Line 645:WriteLiteral("\r\n\r\n");
Source File: c:\Users\Richard\AppData\Local\Temp\Temporary ASP.NET Files\vs\014a60c5\fc8be8b2\App_Web_create.cshtml.c6727781.vcyi-_hh.0.cs Line: 643
EDIT
Я это для загрузки изображения:
string file = model.Image.FileName;
string path = Server.MapPath(@"~/Content/ProductImages");
model.Image.SaveAs(path + "/" + file);
Я ступил через него и все переменные в порядке, он добавляет данные в базу данных, но не спасает изображение, и я не могу для жизни понять, почему?
спасают вас модель является 'null' или только его свойства? Обратите внимание, что вам нужно «enctype =» multipart/form-data «' в вашем теге формы, чтобы входной файл был отправлен обратно –
@StephenMuecke проверить мои изменения и посмотреть, что вы думаете. Никогда не видел ничего подобного до – PsychoCoder
Бит трудно читать изображение - можете удалить его и просто включить в сообщение соответствующее сообщение об ошибке. Но когда возникает эта ошибка? Это когда вы попадаете в строку 'return View (« Index »);'? - что на самом деле не имеет смысла, так как это должно быть 'return View (model);' –