如何在控制器中获取局部视图数据

时间:2011-06-17 11:05:00

标签: asp.net-mvc asp.net-mvc-2 asp.net-mvc-3

我在单个视图上使用3个部分视图,我点击了一个提交按钮,我想将信息发送到数据库,我必须从所有部分视图中检索数据。 能否请您提供正确的信息。

Darin我使用L2S所以当我拖动我的存储过程时,我会在

中获得类似的代码
                 [global::System.Data.Linq.Mapping.FunctionAttribute(Name="SP_Name")]
    public int SP_Name(
                [global::System.Data.Linq.Mapping.ParameterAttribute(Name="EmployeeID", DbType="Int")] System.Nullable<int> EmployeeID
{

      IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), EmployeeID);
        encounterID = ((System.Nullable<int>)(result.GetParameterValue(293)));
        return ((int)(result.ReturnValue));
    }
} 

更新了

   <script language="javascript" type="text/javascript">
    $(function () {
        $('#Form1').submit(function () {
            $.ajax({
                url: this.action,
                type: this.method,
                data: $(this).serialize(),
                success: function (data) {
                    var message = data.Result;
                    $('#Result').html(message);

                }
            });
            return false;
        });
    });

</script>

在我的控制器中我使用

public ActionResult Index(FormCollection frm)
    {
     My Code ---------------------  
     return Json(new { Result = "Success" });
    }

当我返回此信息时,我会在帖子中找到一个文件并要求我保存它。 我已经检查过使用flidder,在URL中它向我显示路径为/ only 如果我填写任何特定的部分视图它显示类似/控制器名称/部分视图 你能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

好吧,通常通过对此控制器操作执行HTTP请求来将数据发送到控制器操作。有不同的方法来执行HTTP请求:

  1. 使用指向此操作的<form>标记
  2. 使用AJAX
  3. 因此,如果您使用第一种方法,您可以使用单个<form>包装所有具有多个提交按钮(具有不同名称)的部分。然后,当您单击一个提交按钮时,所有输入字段将被发送到控制器操作,然后在控制器操作内部,您可以根据单击的提交按钮处理数据。

    如果你使用第二个选项,那么只需收集你需要点击uipon按钮的值并按照AJAX请求发送它们。


    更新:

    根据评论部分的要求,这里可以采用第一种技术。它使用两个部分而不是三部分,但可以很容易地推断出来。

    与往常一样,您首先要定义一个视图模型,该模型将代表您希望在此特定视图上使用的数据:

    public class MyViewModel
    {
        public Partial1ViewModel Model1 { get; set; }
        public Partial2ViewModel Model2 { get; set; }
    }
    
    public class Partial1ViewModel
    {
        public string Foo { get; set; }
    }
    
    public class Partial2ViewModel
    {
        public string Bar { get; set; }
    }
    

    然后是控制器:

    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            var model = new MyViewModel
            {
                Model1 = new Partial1ViewModel { Foo = "foo" },
                Model2 = new Partial2ViewModel { Bar = "bar" },
            };
            return View(model);
        }
    
        [HttpPost]
        public ActionResult Index(MyViewModel model)
        {
            // Here you have access to model.Model1.Foo and model.Model2.Bar =>
    
            var button = "";
            if (!string.IsNullOrEmpty(Request["submit1"]))
            {
                // submit1 button was used
                button = "submit1";
            } 
            else if (!string.IsNullOrEmpty(Request["submit2"]))
            {
                // submit2 button was used
                button = "submit2";
            }
    
            var result = string.Format("thanks for submitting using {0}", button);
            return Content(result, "text/plain");
        }
    }
    

    然后是主视图(~/Views/Home/Index.cshtml):

    @model MyViewModel
    
    @using (Html.BeginForm())
    {
        @Html.EditorFor(x => x.Model1)
        @Html.EditorFor(x => x.Model2)
    }
    

    和两个相应的编辑器模板(如果你愿意,还可以是部分模板):

    ~/Views/Home/EditorTemplates/Partial1ViewModel.cshtml

    @model Partial1ViewModel
    <h2>Partial 1</h2>
    <div>
        @Html.LabelFor(x => x.Foo)
        @Html.EditorFor(x => x.Foo)
        <input type="submit" value="Submit me!" name="submit1" />
    </div>
    

    ~/Views/Home/EditorTemplates/Partial2ViewModel.cshtml

    @model Partial2ViewModel
    <h2>Partial 2</h2>
    <div>
        @Html.LabelFor(x => x.Bar)
        @Html.EditorFor(x => x.Bar)
        <input type="submit" value="Submit me!" name="submit2" />
    </div>