2015-07-24 4 views
1

При попытке добавить новый элемент в базу данных (используя 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, когда я попытался запустить его снова, чтобы ответить на ваш вопрос, я получаю это

enter image description here

И понятия не имею, что это, вы видели что-нибудь подобное раньше?

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); 

Я ступил через него и все переменные в порядке, он добавляет данные в базу данных, но не спасает изображение, и я не могу для жизни понять, почему?

+0

спасают вас модель является 'null' или только его свойства? Обратите внимание, что вам нужно «enctype =» multipart/form-data «' в вашем теге формы, чтобы входной файл был отправлен обратно –

+0

@StephenMuecke проверить мои изменения и посмотреть, что вы думаете. Никогда не видел ничего подобного до – PsychoCoder

+0

Бит трудно читать изображение - можете удалить его и просто включить в сообщение соответствующее сообщение об ошибке. Но когда возникает эта ошибка? Это когда вы попадаете в строку 'return View (« Index »);'? - что на самом деле не имеет смысла, так как это должно быть 'return View (model);' –

ответ

0

Заменить:

public async Task<ActionResult> Create([Bind(Include="ProductImageId,ProductName,ProductPrice,Quantity,ProductDescription")] AddNewProductViewModel model) 

с:

public async Task<ActionResult> Create([Bind(Include = "ImagePath,AltText,Name,Price,Quantity,Description")] AddNewProductViewModel model) 
Смежные вопросы