使用模型发布HttpPostedFileBase时始终返回null,但是如果没有模型则正常工作

时间:2018-12-13 08:09:08

标签: c# asp.net-mvc asp.net-mvc-5

我已经尝试了在StackOverflow上找到的所有解决方案,但它们对我不起作用。我也尝试了Tetsuya Yamamoto解决方案,但是当我将其与模型一起使用时,它仍然总是返回null

更新

当我检查它时,我的文件类型输入将保留数据,但在被检查元素中,其值为""

enter image description here

我的发布文件都是这样的

 @using (Html.BeginForm("AddLocation", "MasterData", FormMethod.Post, new { encytype = "multipart/form-data"}))
{
 <div class="file-upload">
          <input type="file" name="postedFile" />
   </div>

//passing model value when using it
}

没有模型的实际效果

 public ActionResult AddLocation(HttpPostedFileBase file)
        {
            try
            {

              if (file != null) //Working Perfact
               {

               }              
                return View(model);
            }
            catch (Exception ex)
            {
                return View(model);
                throw;
            }

        }

模型始终重新运行为空

public ActionResult AddLocation(LocationModel model, HttpPostedFileBase file)
        {
            try
            {
                if (ModelState.IsValid)
                {                    
                    if (file != null) //Always return null when passing with model
                    {

                    }
                }
                return View(model);
            }
            catch (Exception ex)
            {
                return View(model);
                throw;
            }

        }

3 个答案:

答案 0 :(得分:2)

只需在viewmodel类中添加Index.html属性,该属性与function extractVariable(inputScore) { inputScore = 27; //hard coded value works. Why? return inputScore; }; function assignValue(inputScore) { console.log(inputScore); //this console.logs the hard coded value from //extractVariable like it should do document.getElementById("playerScore").value = inputScore; }; 元素中的名称相同:

HttpPostedFileBase

然后从控制器操作中删除第二个参数:

<input type="file" />

并用强类型绑定替换public class LocationModel { // other properties public HttpPostedFileBase PostedFile { get; set; } } 文件元素:

[HttpPost]
public ActionResult AddLocation(LocationModel model)
{
    // do something
}

然后,您的文件应该在相应的viewmodel属性上可用。

旁注:

表单定义中有一个错字,应该使用<input>而不是@Html.TextBoxFor(model => model.PostedFile, new { type = "file" })

enctype

参考:

mvc upload file with model - second parameter posted file is null

答案 1 :(得分:0)

您可以在模型旁边添加HttpPostedFileBase文件,它应该可以获取文件。

public class LocationModel 
{
    ....
    public HttpPostedFileBase File{ get; set; }
}

原因是asp.net mvc中不支持多个发布参数

答案 2 :(得分:0)

@ArunPratap这个问题在asp.net mvc中非常有名, 实际上POST方法获取的文件名称与视图中给定的ID名称相同, 由于表单数据是通过标题发送的, 默认情况下,它接受任何来自表单的信息,但是当您发送多个数据时,相应的POST方法需要使用相同的名称,因为它不能识别来自表单的数据。

示例 在这种情况下:

@using(Html.BeginForm("AddLocation", "MasterData", FormMethod.Post, new {enctype = "multipart/form-data" }))
{
    <div class="file-upload">
        @Html.TextBoxFor(model => model.PostedFile, new { type = "file" })
    </div>
}

无论您为POST方法的参数如何命名,它都会将其标识为文件 但是当用其他字段扩展表单/模型时,它缺乏检测周围文件的功能。 为了获得最佳实践,请使用@TetsuyaYamamoto建议的强类型ViewModel。