2012-12-20 3 views
11

제출을 클릭하면 file 매개 변수가 null입니다. 그것은 갈등과 파일 이름으로 FileViewModel 객체로 파일 속성을 결합하려고 바인더의 이름을 지정할 것양식 제출시 모델이 null입니다.

@model MyProject.Controllers.Admin.FileViewModel 

@{ 
    ViewBag.Title = "Create"; 
    Layout = "~/Views/Shared/_BackOfficeLayout.cshtml"; 
} 

@using (Html.BeginForm("Create", "Files", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <fieldset> 
    <legend>Create</legend> 

    <div class="editor-label"> 
     @Html.LabelFor(model => model.File) 
    </div> 
    <div class="editor-field"> 
     @Html.TextBoxFor(model => model.File, new { type = "file" }) 
     @Html.ValidationMessageFor(model => model.File) 
    </div> 

    <p> 
     <input type="submit" value="Create" /> 
    </p> 
    </fieldset> 
} 

<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

답변

37

당신이 널 얻을 이유, 그건 : 여기

public ActionResult Create() 
{ 
    return View(new FileViewModel()); 
} 

[HttpPost]  
[InitializeBlobHelper] 
public ActionResult Create(FileViewModel file) 
{ 
    if (ModelState.IsValid) 
    { 
    //upload file 
    } 
    else 
    return View(file); 
} 

public class FileViewModel 
{ 
    internal const string UploadingUserNameKey = "UserName"; 
    internal const string FileNameKey = "FileName"; 

    internal const string Folder = "files"; 

    private readonly Guid guid = Guid.NewGuid(); 

    public string FileName 
    { 
    get 
    { 
     if (File == null) 
     return null; 
     var folder = Folder; 
     return string.Format("{0}/{1}{2}", folder, guid, Path.GetExtension(File.FileName)).ToLowerInvariant(); 
    } 
    } 

    [RequiredValue] 
    public HttpPostedFileBase File { get; set; } 
} 

는 cshtml입니다. POST 이름은 대소 문자를 구분하지 않습니다.

변경 :

public ActionResult Create(FileViewModel model) 

또는 다른 이름이뿐만 아니라 내 문제를 해결

+0

Shiat! 나는 그것이 효과가있을 것이라고 믿지 않았지만 그렇게했다. 실제로 이것이 실제로 일어난 이유는 무엇입니까? – Shimmy

+4

@Shimmy 그것은 'File' 속성을'file' 이름으로'FileViewModel' 객체에 바인드하려고하는 이름 충돌과 바인더입니다. 그래서'null'을 얻습니다. POST 이름은 대소 문자를 구분하지 않습니다. – webdeveloper

+1

당신은 착한 사람입니다! 잘 잡으세요! – Shimmy

1

에 :

public ActionResult Create(FileViewModel file) 

에. 그것은 내가 사용했던 모델과 비슷한 모델이었습니다.이 모델은 게시 된 모델에 할당 된 변수와 비슷했습니다. 필드 이름을 정리하면 예상대로 모두 작동했습니다.

물론 오류는 이것을 지적하는 데 도움이되지 않았습니다.