如何通过@ Html.ActionLink或任何其他Html帮助方法将对象从View传递给Controller Action?

时间:2014-09-01 17:19:22

标签: html .net asp.net-mvc razor

我在View内有一个对象,我想传递给控制器​​的动作。

此对象不在数据库中(它是在另一个操作中创建并传递给此View)我想使用@Html方法传递整个对象(创建一个按钮并在单击它时传递它行动)。

例如,我在视图中有Type object个变量。如何通过单击按钮来传递它(对象)。我想使用@Html.*方法而不是Java Script。

控制器名称:MyController

 public ActionResult MyAction(Type ReceivedObject) { 
     return View(); 
 }

修改

所以我不知道该怎么做了。

在这里,我创建了一个元素列表,这些元素是数据库中元素的副本(数据库中有2个调查)。我将它们传递给_Survey1.cshtml视图

 [HttpPost]
        public ActionResult _Survey1(int id) {
            System.Diagnostics.Debug.WriteLine("PASSED ID: " + id);
            Person person = db.Persons.Find(id);
            //Passing a Tuple to Partial View
            List<Survey> localSurveysCopy = new List<Survey>();
            foreach (Survey survey in db.Surveys) {
                localSurveysCopy.Add(new Survey(survey));
            }
            var tuple = new Tuple<Person, List<Survey>>(person, localSurveysCopy) { };
            return PartialView(tuple);
        }

_Survey1.cshtml视图中修改了这些元素。用户点击这里的radiobuttons:

enter image description here

调查中的每个问题都有编辑助手,它定义了radiobutton在AnswerText的{​​{1}}属性中保存答案:

Question

这是提供调查的@model WebApplication2.Models.Question <div> @Html.HiddenFor(x => x.Id) <h3> @Model.QuestionText </h3> @foreach (var a in Model.Answers) { <p> @Html.RadioButtonFor(b => b.SelectedAnswer, a.Id) @a.AnswerText </p> } </div> 视图:

_Survey1

这是我想要传递模型的一部分的方法,两个动作都在同一个控制器中。

@using WebApplication2.Models
@model   System.Tuple<Person, List<Survey>>

<hr />
<h1>Surveys</h1>

<input type="button" id="Coll" value="Collapse" onclick="javascript:CollapseDiv()" />

@{int i = 1;}
@foreach (var survey in Model.Item2) {
    using (Html.BeginForm()) {
        <h2>Survey @(i)</h2>
        <p />
        @Html.EditorFor(x => survey.Questions)

   // <p>@Html.ActionLink("Call Cell Phone", "SubmitSurvey", new {survey = survey}, new { @class = "btn btn-default" })</p>

    }
    i++;
    <hr style="background-color:rgb(126, 126, 126);height: 5px" />
}
<hr />

传递 public ActionResult SubmitSurvey(Person id, List<Survey> listOfSurveys) { //BECAUSE OF ID's of copied Surveys and questions and answers in the // listOfSurveys are the same as Id's of original Questions // in database I want to bind Selected Answers with the Persons here //that is why I need this list return View(); } 很简单,但如何传递此列表?

以下是Person idSurveyQuestion的展示方式:

Answer

以及记得选择了哪些答案的using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace WebApplication2.Models { public class Survey { public int Id { set; get; } public virtual ICollection<Question> Questions { set; get; } public Survey() { } public Survey(Survey survey) { Id = survey.Id; Questions = new List<Question>(); System.Diagnostics.Debug.WriteLine("SURVEY " + survey.Questions == null); foreach (Question question in survey.Questions) { Questions.Add(new Question(question)); } } } public class Question { public int Id { set; get; } public string QuestionText { set; get; } public virtual ICollection<Answer> Answers { set; get; } public virtual Survey Survey { get; set; } public string SelectedAnswer { set; get; } //this field is SET after clicking SAVE button public Question() { } public Question(Question question) { Id = question.Id; QuestionText = question.QuestionText; Answers = question.Answers; Survey = question.Survey; SelectedAnswer = ""; } } public class Answer {C:\Users\R\documents\visual studio 2013\Projects\WebApplication2\WebApplication2\Models\Survey.cs public int Id { set; get; } public string AnswerText { set; get; } public virtual Question Question { get; set; } public virtual ICollection<Person> Persons { get; set; } } } (多对多关系Person

Answer<---> Person

1 个答案:

答案 0 :(得分:3)

你做不到。或者至少你不能以你想的方式。

首先,这与助手无关。帮助程序只生成HTML,因此它们受HTML约束的约束。其次,您需要生成的URL本身受HTTP约束的约束。如果您正在讨论执行GET请求(HTML中标准运行的mill锚链接),那么传递数据的唯一方法是通过查询字符串。那是你有时在网址中看到的?foo=bar&bar=baz爵士乐。查询字符串仅支持简单的名称 - 值对。虽然您可以单独传递该对象的每个属性,但无法将完整对象作为单个参数传递。 MVC中的模型绑定器非常智能,可以获取查询字符串的各个项目,并将它们连接回它们所属的类中,如果它们可以匹配它们。例如,假设您有一个类:

public class Foo
{
    public string Bar { get; set; }
    public int Baz { get; set; }
}

并采取以下行动:

public ActionResult Foo(Foo model)
{
    ...
}

您可以通过以下方式生成可以使用的链接:

@Html.ActionLink("This is a foo.", "Foo", new { Bar = "Bar", Baz = 1 })

模型绑定器会识别出它在查询字符串中具有BarBaz的值,并使用它来创建具有这些值的Foo实例。

如果您有POST请求,只能使用method设置为“post”的HTML表单,那么您可以以类似的方式包含该类的属性,仅限现在,它们将是实际的HTML输入而不是直接在查询字符串中传递。例如:

@using (Html.BeginForm("Foo")) {
    <input type="hidden" name="Bar" value="Bar" />
    <input type="hidden" name="Baz" value="1" />
    <button type="submit">Submit</button>
}

同样,modelbinder将匹配属性名称并使用这些值构造类的实例。但是,同样,您不能简单地传递一个对象,而只能传递该对象的属性。即使使用POST,单独的HTML也只能提交x-www-form-urlencoded帖子正文,这只是您在GET请求中看到的查询字符串样式的奇特名称。

要发布实际对象,您必须使用一些数据交换格式,例如JSON或XML。而且,这只能借助于您明确不想要的JavaScript来完成。