2012-04-07 1 views
1

Это должно быть прямолинейно, но здесь идет - мы используем MVC4 для обработки многочастного запроса формы для загрузки двоичного файла вместе с некоторыми метаданными через строго типизированный вид в MVC4.ASP.NET MVC Model Binder Fails со строками, которые выглядят как номера версий?

Одно из полей является номер версии файла (то есть что-то вроде 0.0.6, 0.4.5 предусилителя, и т.д ...)

Я получаю следующее сообщение об ошибке от модель связующего, когда он пытается связать эту версию поле номера в поле модели (типа строка):

{ "преобразование параметров из„System.String“типа к типу „Models.NewFileVersion“не удалось, потому что нет преобразователь типа может преобразовывать между этими типами. "}

В частности, ошибка может быть отнесена к нашему полю «VersionNumber» - любые идеи относительно того, почему это может произойти?

Edit: Исходный код ниже

NewFileVersion.cs

public class NewFileVersion 
{ 
    [Display(Name = "Version # (0.67, 0.66-pre, etc...)")] 
    [Required] 
    public string Version { get; set; } 

    [Required] 
    [StringLength(2000, ErrorMessage = "ChangeLog must be between 30 an 2000 characters", MinimumLength = 30)] 
    [Display(Name = "Version Notes (will be visible to end-users)")] 
    [DataType(DataType.MultilineText)] 
    public string ChangeLog { get; set; } 

    [Display(Name = "Target Platform")] 
    [UIHint("Enum")] 
    public FileType PlatformTarget { get; set; } 
} 

New.cshtml

@model ViewModels.NewFileVersion 
@{ 
    ViewBag.Title = "New"; 
} 
<div class="container" id="main-content"> 
    <div class="row"> 
     <h2> 
      New</h2> 
     @using (Html.BeginForm("Create", "Files", FormMethod.Post, new { enctype = "multipart/form-data" })) 
     { 
      @Html.ValidationSummary(true) 

      <fieldset> 
       <legend>NewFileVersion</legend> 
       <div class="editor-label"> 
        @Html.LabelFor(model => model.Version) 
       </div> 
       <div class="editor-field"> 
        @Html.EditorFor(model => model.Version) 
        @Html.ValidationMessageFor(model => model.Version) 
       </div> 
       <div class="editor-label"> 
        @Html.LabelFor(model => model.ChangeLog) 
       </div> 
       <div class="editor-field"> 
        @Html.EditorFor(model => model.ChangeLog) 
        @Html.ValidationMessageFor(model => model.ChangeLog) 
       </div> 
       <div class="editor-label"> 
        @Html.LabelFor(model => model.PlatformTarget) 
       </div> 
       <div class="editor-field"> 
        @Html.EditorFor(model => model.PlatformTarget) 
       </div> 
       <div class="editor-label"> 
        <label for=""> 
         File:</label></div> 
       <div class="editor-field"> 
        <input type="file" name="fileData" required="required" /></div> 
       <p> 
        <input type="submit" value="Upload File" /> 
       </p> 
      </fieldset> 
     } 
     <div> 
      @Html.ActionLink("Back to List", "Index") 
     </div> 
    </div> 
</div> 

FilesController.cs

[HttpPost] 
    public ActionResult Create(NewFileVersion version, HttpPostedFileBase fileData) 
    { 
     //if our model is valid 
     if(ModelState.IsValid) 
     { 
      //etc....    
     } 

     ModelState.AddModelError("", "Invalid file submission"); 

     return View("New", version); 
    } 
+1

Можете ли вы опубликовать ур модельный класс и реализацию действия контроллера? Здесь нет кода, и людям было бы сложно понять. – tugberk

+0

Из-за ошибки это не похоже, что одно из полей на самом деле является строкой. Он пытается преобразовать что-то в тип Models.NewFileVersion. Это тип перечисления? Но, как @tugberk говорит, если бы вы могли опубликовать список кода, который бы помог. – ngm

+0

@tugberk сделано и сделано - добавлен исходный код. Здесь есть поле enum (и у меня есть собственный шаблон редактора для него), но это не значит, что привязка модели бросает ошибку. Он не работает в поле «версия» в верхней части страницы. – Aaronontheweb

ответ

1

Попробуйте переименовать параметр version для Create действия, например:

public ActionResult Create(NewFileVersion fileVersion, HttpPostedFileBase fileData) { ... } 

модель Связующее может быть путаются между свойством string version модели и параметром NewFileVersion version действия.


Вы можете понять, почему это происходит в методе BindModel, так как модель имеет свойство точно соответствует имя параметра действия он пытается связать как простой тип/модель, а не сложным.

 Смежные вопросы

  • Нет связанных вопросов^_^