проверить индивидуальное свойство модели представления, используя аннотацию данных

Я пытаюсь создать несколько загрузок файлов, используя модель представления и аннотацию данных. Ниже приведена модель просмотра:

 public class UploadNewsModel
{
[File(AllowedFileExtensions = new string[] { ".jpg", ".gif", ".tiff", ".png", ".pdf" }, MaxContentLength = 1024 * 1024 * 8, ErrorMessage = "Invalid File")]
        public HttpPostedFileBase GenearlNews { get; set; }

        [File(AllowedFileExtensions = new string[] { ".jpg", ".gif", ".tiff", ".png", ".pdf" }, MaxContentLength = 1024 * 1024 * 8, ErrorMessage = "Invalid File")]
      public HttpPostedFileBase SportNews { get; set; }

        [File(AllowedFileExtensions = new string[] { ".jpg", ".gif", ".tiff", ".png", ".pdf" }, MaxContentLength = 1024 * 1024 * 8, ErrorMessage = "Invalid File")]
      public HttpPostedFileBase BusiNews { get; set; }

        [File(AllowedFileExtensions = new string[] { ".jpg", ".gif", ".tiff", ".png", ".pdf" }, MaxContentLength = 1024 * 1024 * 8, ErrorMessage = "Invalid File")]
      public HttpPostedFileBase InterNews { get; set; }

        [File(AllowedFileExtensions = new string[] { ".jpg", ".gif", ".tiff", ".png", ".pdf" }, MaxContentLength = 1024 * 1024 * 8, ErrorMessage = "Invalid File")]
      public HttpPostedFileBase EntertaintNews { get; set; }
        }

Проблема. Здесь я хочу проверить состояние модели отдельного свойства, чтобы показать ошибку в отдельной ошибке проверки. Я понятия не имею, как проверить индивидуальность, тогда как для всех моделей представления мы используем ModelState.IsValid. У меня есть следующее действие:

  [HttpPost]
  public ActionResult Index(UploadNewsModel newsmodel)
{

    HttpPostedFileBase general = newsmodel.GenearlNews;
    HttpPostedFileBase sport = newsmodel.SportNews;
    HttpPostedFileBase business = newsmodel.BusiNews;
    HttpPostedFileBase international = newsmodel.InterNews;
    HttpPostedFileBase entertainment = newsmodel.EntertaintNews;


    if (general.ContentLength > 0 && general != null && ...check generalnews validation using data annotation == valid.. )
    {
        var fileName = Path.GetFileName(general.FileName);
        var path = Path.Combine(Server.MapPath("~/App_Data/uploads/News/General News/"), fileName);
        general.SaveAs(path);
    }
    else
    {
        .... add error of data annotation plus  below
        ModelState.AddModelError("", "The user name or password provided is incorrect.");
    }

     ......... same for remaining upload file
    return View(newsmodel);
}

Просмотр:

    @model IVRControlPanel.Models.UploadNewsModel

  @using (Html.BeginForm("index", "NewsUpload", FormMethod.Post, new { name = "form1", @id = "form1", enctype = "multipart/form-data" }))
        {


       @Html.ValidationSummary(true)
  @Html.TextBoxFor(model => model.GenearlNews, new {  type = "file" })
               @Html.ValidationMessageFor(model => model.GenearlNews)
          ........... same for remaining file upload
            }

person CodeManiac    schedule 21.08.2012    source источник


Ответы (2)


У вашего UploadNewsModel нет никаких свойств для Username/Password, откуда вы их берете?

Если вы хотите разрешить авторизованный доступ только к действию вашего контроллера, вам следует использовать атрибут Атрибут авторизации.

[HttpPost]  
[Authorize]
public ActionResult Index(UploadNewsModel newsmodel)
{
    ...
}
person James    schedule 21.08.2012
comment
Я думаю, что это имя пользователя/пароль является сообщением об ошибке копирования и вставки из другой части его кода. - person TrizZz; 21.08.2012

Если вы хотите вернуть сообщение об ошибке, вам нужно будет проверить правильность:

  [HttpPost]
  public ActionResult Index(UploadNewsModel newsmodel)
{
    // If not Valid
    if (!ModelState.IsValid)
    {
       return this.View(newsmodel);
    }
    HttpPostedFileBase general = newsmodel.GenearlNews;
    HttpPostedFileBase sport = newsmodel.SportNews;
    HttpPostedFileBase business = newsmodel.BusiNews;
    HttpPostedFileBase international = newsmodel.InterNews;
    HttpPostedFileBase entertainment = newsmodel.EntertaintNews;


    if (general.ContentLength > 0 && general != null && ...check generalnews validation using data annotation == valid.. )
    {
        var fileName = Path.GetFileName(general.FileName);
        var path = Path.Combine(Server.MapPath("~/App_Data/uploads/News/General News/"), fileName);
        general.SaveAs(path);
    }
    else
    {
        .... add error of data annotation plus  below
        ModelState.AddModelError("", "The user name or password provided is incorrect.");
    }

     ......... same for remaining upload file
    return View(newsmodel);
}

Таким образом, он должен отображать только ошибки опубликованных файлов; Если вы хотите, чтобы все 5 полей были заполнены, вам нужно будет добавить [Обязательно]:

[Required]
     [File(AllowedFileExtensions = new string[] { ".jpg", ".gif", ".tiff", ".png", ".pdf" }, MaxContentLength = 1024 * 1024 * 8, ErrorMessage = "Invalid File")]
          public HttpPostedFileBase SportNews { get; set; }

** Вы не сможете проверить каждое свойство отдельно для проверки, но с isValid вы уведомите пользователя о неправильном файле.

person TrizZz    schedule 21.08.2012