我在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:
调查中的每个问题都有编辑助手,它定义了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 id
,Survey
和Question
的展示方式:
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
答案 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 })
模型绑定器会识别出它在查询字符串中具有Bar
和Baz
的值,并使用它来创建具有这些值的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来完成。