Asp.net mvc 从控制器中的模型获取值

Asp.net mvc 从控制器中的模型获取值,asp.net-mvc,asp.net-mvc-4,Asp.net Mvc,Asp.net Mvc 4,我从ASP.NETMVC4开始,我有一个问题 我已经编写了这段代码来向模型中的属性添加数据 public void SetModelValues() { var modelObj = new MyModel(); modelObj.name="MyName"; modelObj.email="someone@mymail.com"; modelObj.company="MyCompany"; mode

我从ASP.NETMVC4开始,我有一个问题

我已经编写了这段代码来向模型中的属性添加数据

    public void SetModelValues()
    {
        var modelObj = new MyModel();
        modelObj.name="MyName";
        modelObj.email="someone@mymail.com";
        modelObj.company="MyCompany";
        modelObj.message="Some text here";
    }
我如何从另一个动作中获得该值


感谢并为“新手主义”感到抱歉:)

该方法不会为您的模型设置任何值。您需要设置模型,然后将其传递给视图

例如,您的控制器如下所示:

public ActionResult Index()
{
    var modelObj = new MyModel();
    modelObj.name="MyName";
    modelObj.email="someone@mymail.com";
    modelObj.company="MyCompany";
    modelObj.message="Some text here";

    return View(modelObj);
}
@model MyModel

<p>Name: @Model.name</p>
<p>Email: @Model.email</p>
<p>Company: @Model.company</p>
<p>Message: @Model.message</p>
完成此操作后,模型将可在视图中使用

相应的Razor视图
Index.cshtml
可以是这样的:

public ActionResult Index()
{
    var modelObj = new MyModel();
    modelObj.name="MyName";
    modelObj.email="someone@mymail.com";
    modelObj.company="MyCompany";
    modelObj.message="Some text here";

    return View(modelObj);
}
@model MyModel

<p>Name: @Model.name</p>
<p>Email: @Model.email</p>
<p>Company: @Model.company</p>
<p>Message: @Model.message</p>
@model-MyModel
名称:@Model.Name

电子邮件:@Model.Email

公司:@Model.Company

Message:@Model.Message


HTH

该方法不会为您的模型设置任何值。您需要设置模型,然后将其传递给视图

例如,您的控制器如下所示:

public ActionResult Index()
{
    var modelObj = new MyModel();
    modelObj.name="MyName";
    modelObj.email="someone@mymail.com";
    modelObj.company="MyCompany";
    modelObj.message="Some text here";

    return View(modelObj);
}
@model MyModel

<p>Name: @Model.name</p>
<p>Email: @Model.email</p>
<p>Company: @Model.company</p>
<p>Message: @Model.message</p>
完成此操作后,模型将可在视图中使用

相应的Razor视图
Index.cshtml
可以是这样的:

public ActionResult Index()
{
    var modelObj = new MyModel();
    modelObj.name="MyName";
    modelObj.email="someone@mymail.com";
    modelObj.company="MyCompany";
    modelObj.message="Some text here";

    return View(modelObj);
}
@model MyModel

<p>Name: @Model.name</p>
<p>Email: @Model.email</p>
<p>Company: @Model.company</p>
<p>Message: @Model.message</p>
@model-MyModel
名称:@Model.Name

电子邮件:@Model.Email

公司:@Model.Company

Message:@Model.Message


我想帮助完成纳西尔的回答。他所概述的完全正确。但要回答您关于如何从另一个操作访问这些值的问题,必须在下一次回发时将该视图模型传递回该控制器。例如,您可以在一个动作中创建视图模型,并将该动作传递给视图。MVC通过使用您的值创建控件,在下一次回发时将数据传递回表单。如果使用视图模型中的值,这些值将丢失,因此可以使用这些值渲染控件:

@Html.TextBoxFor(m => m.MyProperty); 
或者,如果要确保在下一次回发时传递该字段,但不需要显示该字段,则只需创建隐藏字段,使其仍在源中呈现,以便可以传递回下一个操作:

@Html.HiddenFor(m => m.MyProperty);
因此,当您将此表单发回时,它将作为表单数据(键值对)发送回通过提交表单调用的控制器操作。MVC将尝试将其反序列化为一种操作参数类型(因此确保其中一种类型与ViewModel相同)。通过这样做,信息将在该操作中可用

再详细阐述一下

public class MyViewModel
{
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
}

// Index.cshtml - bound to MyViewModel
// This will render a text box that will read "Property 1". It will also render a hidden field 
// containing "Property 2" but will not be displayed on the page. When you click the submit button, 
// it will post back to the PostTest action on the Home controller. Notice that Prop3 wasn't used
// so it won't be included in the postback
@model MyProject.Models.MyViewModel
<div>
    @using(Html.BeginForm("PostTest", "Home", FormMethod.Post))
    {
        @Html.TextBoxFor(m => m.Prop1);  
        @Html.HiddenFor(m => m.Prop2);

        <button type="submit">GO!</button>
    }
</div>

public class HomeController : Controller
{
    public ActionResult Index()
    {
        // your index view is bound to MyViewModel so we'll hydrate that and send it to the view for rendering
        var viewModel = new MyViewModel();
        viewModel.Prop1 = "Property 1";
        viewModel.Prop2 = "Property 2";
        viewModel.Prop3 = "Property 3";

        return View(vm);
    }

    public ActionResult PostTest(MyViewModel vm) // mvc will attempt to deserialize your form data into this object
    {
        var testProp1 = vm.Prop1; // "Property 1"
        var testProp2 = vm.Prop2; // "Property 2"
        var testProp3 = vm.Prop3; // null
    }
}
公共类MyViewModel
{
公共字符串Prop1{get;set;}
公共字符串Prop2{get;set;}
}
//Index.cshtml-绑定到MyViewModel
//这将呈现一个文本框,该文本框将显示“属性1”。它还将渲染一个隐藏字段
//包含“属性2”,但不会显示在页面上。单击“提交”按钮时,
//它将发回主控制器上的PostTest操作。请注意,没有使用Prop3
//所以它不会包含在回发中
@模型MyProject.Models.MyViewModel
@使用(Html.BeginForm(“postest”、“Home”、FormMethod.Post))
{
@TextBoxFor(m=>m.Prop1);
@HiddenFor(m=>m.Prop2);
去
}
公共类HomeController:控制器
{
公共行动结果索引()
{
//您的索引视图已绑定到MyViewModel,因此我们将添加该视图并将其发送到视图进行渲染
var viewModel=新的MyViewModel();
viewModel.Prop1=“属性1”;
viewModel.Prop2=“属性2”;
viewModel.Prop3=“属性3”;
返回视图(vm);
}
public ActionResult PostTest(MyViewModel vm)//mvc将尝试将表单数据反序列化到此对象中
{
var testProp1=vm.Prop1;//“属性1”
var testProp2=vm.Prop2;/“属性2”
var testProp3=vm.Prop3;//null
}
}

我想帮助完成Nasir的回答。他所概述的完全正确。但要回答您关于如何从另一个操作访问这些值的问题,必须在下一次回发时将该视图模型传递回该控制器。例如,您可以在一个动作中创建视图模型,并将该动作传递给视图。MVC通过使用您的值创建控件,在下一次回发时将数据传递回表单。如果使用视图模型中的值,这些值将丢失,因此可以使用这些值渲染控件:

@Html.TextBoxFor(m => m.MyProperty); 
或者,如果要确保在下一次回发时传递该字段,但不需要显示该字段,则只需创建隐藏字段,使其仍在源中呈现,以便可以传递回下一个操作:

@Html.HiddenFor(m => m.MyProperty);
因此,当您将此表单发回时,它将作为表单数据(键值对)发送回通过提交表单调用的控制器操作。MVC将尝试将其反序列化为一种操作参数类型(因此确保其中一种类型与ViewModel相同)。通过这样做,信息将在该操作中可用

再详细阐述一下

public class MyViewModel
{
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
}

// Index.cshtml - bound to MyViewModel
// This will render a text box that will read "Property 1". It will also render a hidden field 
// containing "Property 2" but will not be displayed on the page. When you click the submit button, 
// it will post back to the PostTest action on the Home controller. Notice that Prop3 wasn't used
// so it won't be included in the postback
@model MyProject.Models.MyViewModel
<div>
    @using(Html.BeginForm("PostTest", "Home", FormMethod.Post))
    {
        @Html.TextBoxFor(m => m.Prop1);  
        @Html.HiddenFor(m => m.Prop2);

        <button type="submit">GO!</button>
    }
</div>

public class HomeController : Controller
{
    public ActionResult Index()
    {
        // your index view is bound to MyViewModel so we'll hydrate that and send it to the view for rendering
        var viewModel = new MyViewModel();
        viewModel.Prop1 = "Property 1";
        viewModel.Prop2 = "Property 2";
        viewModel.Prop3 = "Property 3";

        return View(vm);
    }

    public ActionResult PostTest(MyViewModel vm) // mvc will attempt to deserialize your form data into this object
    {
        var testProp1 = vm.Prop1; // "Property 1"
        var testProp2 = vm.Prop2; // "Property 2"
        var testProp3 = vm.Prop3; // null
    }
}
公共类MyViewModel
{
公共字符串Prop1{get;set;}
公共字符串Prop2{get;set;}
}
//Index.cshtml-绑定到MyViewModel
//这将呈现一个文本框,该文本框将显示“属性1”。它还将渲染一个隐藏字段
//包含“属性2”,但不会显示在页面上。单击“提交”按钮时,
//它将发回主控制器上的PostTest操作。请注意,没有使用Prop3
//所以它不会包含在回发中
@模型MyProject.Models.MyViewModel
@使用(Html.BeginForm(“postest”、“Home”、FormMethod.Post))
{
@TextBoxFor(m=>m.Prop1);
@HiddenFor(m=>m.Prop2);
去
}
公共类HomeController:控制器
{
公共行动结果索引()
{
//您的索引视图已绑定到MyViewModel,因此我们将添加该视图并将其发送到视图进行渲染
var viewModel=新的MyViewModel();
viewModel.Prop1=“Prope