如何在不使用表单字段的情况下将值从视图传递到控制器?

时间:2017-06-14 19:08:28

标签: c# asp.net-mvc

我有一个视图,它是一个用于上传文件的页面。此视图调用需要传入名称的控制器以及文件名列表。我能够传递文件名列表,但我不知道如何将客户名称从我的视图传递回控制器。我不希望有一个随机文本框,因为我想使用Model.customerName中已有的特定值。

控制器

public ActionResult UploadFiles(Customer customer)
{
     FileModel fileModel = new FileModel();
     fileModel.customerName = customer.Name;

     return View(fileModel);
}

[HttpPost]
public ActionResult UploadFiles(HttpPostedFileBase[] files)
{
      foreach (HttpPostedFileBase file in files)
      {
          if (file != null)
          {
              var ServerSavePath = Path.Combine(Server.MapPath("~/Files/") + file.FileName);
              file.SaveAs(ServerSavePath);

              //upload to sharepoint
              UploadFileToSharePoint(ServerSavePath);

              ViewBag.UploadStatus = files.Length.ToString() + " files uploaded successfully.";
          }
      }

    return View();
}

查看

@model Models.FileModel

@if (Model.customerName != null)
{
    <h2>@Model.customerName</h2>
}

@using (Html.BeginForm("UploadFiles", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{ 
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <div class="form-group">
            @Html.LabelFor(model => model.files, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.TextBoxFor(model => model.files, "", new { @type = "file", @multiple = "multiple" })
                @Html.ValidationMessageFor(model => model.files, "", new { @class = "text-danger" })
            </div>
        </div>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit"  value="Upload" class="btn btn-primary" />
            </div>
        </div>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10 text-success">
                @ViewBag.UploadStatus
            </div>
        </div>

    </div>
}
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>  

我尝试在enctype =“multipart / form-data”之后传入它,但它在我的控制器中显示为null。

更新 我最终在视图中使用了隐藏字段。

@Html.HiddenFor(m => m.customerName, new {Value = Model.customerName})

在我的控制器中,我必须抓住FormCollection

public ActionResult UploadFiles(System.Web.Mvc.FormCollection fc, 
HttpPostedFileBase[] files)
{
      string customerName = fc["customerName"];
      ...
}

2 个答案:

答案 0 :(得分:0)

您可以使用隐藏字段在模型中传递模型数据。

您可以使用Html.HiddenFor()center-align

答案 1 :(得分:0)

你所做的一切都是正确的,除了你必须使用的正确重载,这种重载的beginform()

public static MvcForm BeginForm(
    this HtmlHelper htmlHelper,
    string actionName,
    string controllerName,
    object routeValues,
    FormMethod method,
    object htmlAttributes
)

在这里你必须在表格方法之前传递路线值,如下面的例子

你的例子:

查看代码:

@using (Html.BeginForm("UploadFiles", "Home",new{cusname = Model.customerName }, FormMethod.Post, new { enctype = "multipart/form-data" }))
{ 
       //any logic
}

控制器代码:

[HttpPost]
public ActionResult UploadFiles(HttpPostedFileBase[] files,string cusname) 
{
     //any logic
}

希望上面的代码很有帮助

由于

KARTHIK