【问题标题】:How to pass input data from the view to the controller如何将输入数据从视图传递到控制器
【发布时间】:2013-04-29 10:36:04
【问题描述】:

我是 ASP.net MVC 的新手,我使用 DevExpress-MVC 扩展来构建一个使用 DataGrid 的小型应用程序,即员工时间登记。

我的问题如下:

用户可以输入他的姓名缩写,将其提交给控制器应该调用我的数据库的查询并显示他的响应员工 ID。

我让我的 DataViewModel 将我的模型传递给视图,现在我认为将它绑定到文本框并从 ViewModel 检索数据会这样做,但事实并非如此。

我的代码如下所示:

ViewModel

    public class MyErfassungViewModel
{
    public MyErfassung erfassung;
    public String personalnummer;
    public String personalkuerzel;
    public List<String> dim1;
    public List<String> dim2;
    public List<String> dim3;
    public List<String> dim4;
    public List<String> dim5;

    public MyErfassungViewModel(MyErfassung myerfassung)
    {
        this.erfassung = myerfassung;
    }
}

查看

    @model DevExpressMvcApplication.Models.ViewModel.MyErfassungViewModel
    <div class ="Personalnummer">
    @using (Html.BeginForm("getNummer","MyErfassung"))
    {
        <label>Personalkürzel</label>
        @Html.DevExpress().TextBox(settings =>
        {
            settings.Name = "TextBoxPersonalkürzel";
        }).Bind(Model.personalkuerzel).GetHtml()

        <label>Personalnummer</label>

        @Html.DevExpress().TextBox(settings =>
        {
            settings.Name = "TextBoxPersonalnummer";
            settings.ReadOnly = true;
        }).Bind(Model.personalnummer).GetHtml()

        @Html.DevExpress().Button(settings =>
        {
            settings.Name = "TextBoxKuerzel";
            settings.Text = "Holen";
            settings.UseSubmitBehavior = true;
        }).GetHtml()
        <br>
    }
</div>

控制器

    //
    // GET: /MyErfassung/

    public ActionResult Index()
    {
        viewModel.personalkuerzel = "sese";
        return View(viewModel);
    }
    [HttpPost]
    public ActionResult getNummer()
    {
        String kurz = Convert.ToString(Request["TextBoxKuerzel"]);
        String nr = Convert.ToString(Request["TextBoxPersonalnummer"]);

        String nummer = dbRepo.getPersonalnummerByKuerzel(viewModel.personalkuerzel);
        viewModel.personalnummer = nummer;
        return View(viewModel);
    }

正如您所见,我尝试了一些可能的方法来接收用户输入并发送 DB-Request 以获取数字。 但是请求或视图模型包含的不仅仅是空引用。

但简单地说,我无法将用户输入从我的表单传回控制器。

【问题讨论】:

    标签: asp.net-mvc razor devexpress


    【解决方案1】:

    您只需将视图模型传递给您的控制器操作,模型绑定器将负责其余的工作。然后,您可以访问这些属性并按照您认为合适的方式使用它们:

    [HttpPost]
    public ActionResult getNummer(MyErfassungViewModel viewModel)
    {
        String nummer = dbRepo.getPersonalnummerByKuerzel(viewModel.personalkuerzel);
        ...
    }
    

    当您为 POST 操作方法定义 MyErfassungViewModel 参数(例如,称为 viewModel)时,ASP.NET MVC 模型绑定器将采用来自您的视图的表单值,填充 @ 的实例987654324@ 并将其传递给您的方法。

    目前你的getNummer方法的参数列表是空的,所以没有地方可以传入视图模型。

    更新:因为MyErfassungViewModel 有一个重载的构造函数,您需要添加一个默认构造函数,以便模型绑定器可以实例化它:

    public class MyErfassungViewModel
    {
        public MyErfassung erfassung;
        public String personalnummer;
        public String personalkuerzel;
        public List<String> dim1;
        public List<String> dim2;
        public List<String> dim3;
        public List<String> dim4;
        public List<String> dim5;
    
        public MyErfassungViewModel(MyErfassung myerfassung)
        {
            this.erfassung = myerfassung;
        }
    
        public MyErfassungViewModel()
        {
        }
    }
    

    【讨论】:

    • 听起来很棒,但如果我尝试这个,我会得到“没有为此对象定义无参数构造函数。”我试图理解脚手架模板是如何实现这一点的,但是从视图到控制器的连接对我来说仍然是一种魔力。我认为我在视图的第 3 行中遗漏了一些东西:“@using (Html.BeginForm("getNummer","MyErfassung"))"
    • 你能发布整个堆栈跟踪吗?
    • 这样就解决了异常,可惜他拿到的MyErfassung的对象不包含表单数据,myerfassung.personalkuerzel为null,所以输入没有传给它。
    • 我对 DevExpress 不太熟悉,但看起来您正在覆盖文本框的 namesettings.Name = "TextBoxPersonalkürzel"; - 这将更改帖子值的名称,并且无法将字段与模型的属性相匹配。试试去掉那条线?您还必须对其他输入执行此操作。
    • 这一切都不起作用的原因是在 MyErfassungViewModel 中,我没有设置 {get;set;} 属性。
    【解决方案2】:

    以下问题提供了最终将我引向我的数据的解决方案

    ASP.NET MVC Passing Data from View to Controller

    对于我的解决方案,代码如下所示:

    查看

        [HttpPost]
        public ActionResult getNummer()
        {
            String kurz = Convert.ToString(Request["personalkuerzel"]);
            String nr = Convert.ToString(Request["personalnummer"]);
    
            String nummer = dbRepo.getPersonalnummerByKuerzel(kurz);
            viewModel.personalnummer = nummer;
            return View(viewModel);
        }
    

    不幸的是,这个解决方案似乎没有使用 Ant P 描述的舒适方式,即自动将响应数据应用于模型。

    【讨论】:

    • link上面的解决方案不是你应该这样做的,访问链接看看如何正确绑定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多