将模型数据从View传递到Controller并使用其值

时间:2017-04-19 12:25:19

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

我正在尝试从视图中发送数据并在控制器中使用它来构建我正在处理的上传文件功能的文件名,我的代码如下。

控制器

    // GET: File
    [Authorize(Roles = "Admin, Lecturer")]
    public ActionResult Index()
    {



        foreach (string upload in Request.Files)
        {
            if (Request.Files[upload].FileName != "")
            {
                string path = AppDomain.CurrentDomain.BaseDirectory + "/App_Data/uploads/";
                string filename = Path.GetFileName(Request.Files[upload].FileName);
                Request.Files[upload].SaveAs(Path.Combine(path, filename));
            }
        }
        return View();
    }

模型

public class UploadModel
{
    [Required(ErrorMessage = "Course is required")]
    public string Course { get; set; }
    [Required(ErrorMessage = "Title is required")]
    public string Title { get; set; }

    public string Uploader { get; set; }
}

查看

<div class="uploadContainer">
    <table>


        <tr>
            <td>Title :</td>
            <td colspan="2" class="editPostTitle">
                @Html.TextBoxFor(tuple => tuple.Item1.Title, new { @class = "uploadTitleInp" })
                @Html.ValidationMessageFor(tuple => tuple.Item1.Title)
            </td>
        </tr>

        <tr>
            <td>Course :</td>
            <td>
                @{
                    List<SelectListItem> listItems = new List<SelectListItem>();
                    foreach (var cat in courses)
                    {
                        listItems.Add(new SelectListItem
                        {
                            Text = cat.Course.Name,
                            Value = cat.Course.Name
                        });
                    }
                }

                @Html.DropDownListFor(tuple => tuple.Item1.Course, listItems, "-- Select Status --")

                @Html.ValidationMessageFor(tuple => tuple.Item1.Course)
            </td>
        </tr>

        <tr>
            <td>File :</td>
            <td>
                <input type="file" name="FileUpload1" id="fileUpload" required />
            </td>
        </tr>

        <tr>
            <td></td>
            <td>
                <input id="btnUploadFile" type="button" value="Upload File" />
            </td>
        </tr>

    </table>

</div>

此方法负责将上载的文件放入目录中。我希望能够做的是通过这样做来创建一个文件名。

string filename = model.Title + " - " + model.Course;

我通常知道如何在使用数据库存储数据时实现这一点,但由于我没有存储在数据库中上传的文件,所以我真的不知道如何将模型数据传递给控制器​​,所以我可以使用用户输入的值来构造文件名。我对这个框架和语言相对较新,所以任何帮助和指针都会受到极大的关注。

提前致谢!

2 个答案:

答案 0 :(得分:0)

您必须将数据通过模型传递回单独的控制器方法。这可以实现如下(我已经简化了你的代码,但一般实现应该有效):

public class UploadViewModel
{    
    public string Course { get; set; }
    public string Title { get; set; }
}

你的GET行动:

public ActionResult Index()
{
    return View(new UploadViewModel());
}

然后在您的视图中添加模型并在表单中使用它,以便将数据绑定到您的模型。然后可以将其发送回您的控制器。

@model UploadViewModel
@using(Html.BeginForm())
{
    Course: @Html.TextBoxFor(s=>s.Course)
    Title: @Html.TextBoxFor(s=>s.Title)
    <input type="submit" value="Save file" />
}

现在通过控制器中的HttpPost操作方法获取值:

[HttpPost]
public ActionResult Index(UploadViewModel model)
{
    //You can use model.Course and model.Title values now
}

答案 1 :(得分:0)

有两种不同的方式来发送数据controller。您必须匹配您在Controller method

中发送的数据

使用Ajax Post方法:

  

将在javascript上创建转移对象。对象属性名称   必须与Model属性名称相同。

var objAjax = new Object();
     objAjax.Course = 'newCourse'; // Model prop is string type so this value must be string.
     objAjax.Title  = 'newTitle';  

   $.ajax('@Url.Action("MethodName", "ControllerName")', {
                type: 'POST',
                data: JSON.stringify(objAjax),
                contentType: "application/json",
                dataType: "json",
                traditional: true,
                success: function (returnData) {
                    // Do something when get success
                },
                error: function () {
                   // Do something when get an error
                }
            });


    [HttpPost]
    public ActionResult Index(UploadViewModel model)
    {
        //do something with the result
    }

使用FormPost方法

  

Html.BeginFom将模型中的所有数据发送到控制器   按提交按钮

<强> ForExample

@using(Html.BeginForm())
{
    <div>
         // Your code 

        <div>
            <input type="submit" value="Go" />
        </div>
    </div>
}


[HttpPost]
public ActionResult Index(UploadViewModel model)
{
    //do someting
}