【问题标题】:Using webforms in MVC在 MVC 中使用 Web 表单
【发布时间】:2013-10-04 10:23:34
【问题描述】:

我正在学习 MVC,遵循 THIS 教程。 (链接将直接带您到我卡住的地方)。到目前为止,我已经了解到,每个视图都有一个控制器。现在我必须通过教程中提到的网络输入表单从用户那里获取输入。在我的项目中,我有一个名为 Default1 的控制器,我可以将它作为 localhost:xyz/Default1/Index 运行。它运行完美。

然后我创建了一个新的控制器,命名为 Default2 并将它绑定到某个视图以显示一些数据,它完美地作为 localhost:xyz/Default2/Displaycustomer 运行。客户信息是静态的(硬编码)。控制器为:

    public ViewResult DisplayCustomers()
    {
        Customer cobj = new Customer();
        cobj.Code = "12";
        cobj.Name = "Zeeshan";
        cobj.Amount = 7000;


        return View("DisplayCustomers",cobj);
    }

现在我必须使用教程中提到的 html 页面 从用户那里获取关于客户信息的输入。所以我尝试在 view 文件夹下添加一个新的 webform,并将我的控制器修改为:

[HttpPost]
    public ViewResult DisplayCustomers()
    {
        Customer cobj = new Customer();

        cobj.Code = Request.Form["Id"].ToString();
        cobj.Name = Request.Form["Name"].ToString();
        cobj.Amount = Convert.ToDouble(Request.Form["Amount"].ToString());

        return View("DisplayCustomers",cobj);
    }

我的问题是:我怎样才能让我的项目盯着看,以便它首先接受输入,然后使用上面的控制器显示它?我是否在正确的位置添加了网络表单?运行它的链接是什么?我尝试了 localhost:xyz/Default2/entryform 等但失败了。 (在我的 entryform.aspx 中,我提到了表单 action="DisplayCustomer"

【问题讨论】:

  • 您的观点如何?当您说修改控制器时,这是否意味着在控制器中您只有一个 HttpPost 方法?或者你也有一个 HttpGet?

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


【解决方案1】:

听起来您缺少的是仅显示表单的操作。换句话说,您只需要一个动作来显示一个表单。该表单的 POST 操作应该引用您的控制器的 DisplayCustomers 操作。

所以在你的控制器代码中:

public class CustomerController : Controller 
{
    [HttpGet]
    public ViewResult New()
    {
       return View("NewCustomer");  //Our view that contains the new customer form.
    }

    // Add your code for displaying customers below
}

在你看来,你有这样的代码

@using(Html.BeginForm("DisplayCustomers", "Customer")) {
    <!-- Add your form controls here -->
}

请注意,我使用的是指定要调用的操作方法和控制器的 BeginForm 帮助器版本。这将写入form 标记以发回您的DisplayCustomers 操作。这是等效的 HTML:

<form method="POST" action="/Customer/DisplayCustomers">

然后您将使用 URL http://test.server/Customer/New 访问您的表单。

【讨论】:

  • 谢谢。我想知道2件事。 1: 根据您的回答,我假设我已经创建了一个名为 Customer 的控制器,用于我们的输入表单视图,名为 NewCustomers。在我们的输入表单中,我们指定它将调用另一个控制器,名为 DisplayCustomers,它将显示客户视图。我做对了吗? 2: 假设,我没有使用这个 html 帮助程序,那么我必须指定
    .. 对吗?
  • @Zeeshan 你的第一个假设是对的。是的,我们创建了一个名为 Customer 的新控制器,但 NewDisplayCustomers 都是该控制器的一部分。至于您的第二个问题,如果您不使用帮助程序,则方法将是 POST,而操作将是 test.server/Customer/DisplayCustomers。我会用这个细节更新我的答案。
  • 很好。我已经开始了解化学了 :) 你的意思是,在同一个控制器中,我们有 2 种方法,用于 2 个视图。对吗?
  • 你明白了!控制器旨在容纳以它们命名的对象、实体或关注区域的行为。
  • 非常感谢 :) 为什么我使用 [HttpPost] 作为 DisplayCustomers() ?
【解决方案2】:

这可能不是世界上最好的例子......但这至少会让你滚动......

网址是:localhost:1234/Home/Customer

控制器

public ActionResult Customer()
    {
        return View();
    }
    [HttpPost]
    public ActionResult Customer(FormCollection frm)
    {

        var name = frm["name"].ToString();
        var address = frm["address"].ToString();

        ViewBag.Name = name;
        ViewBag.Address = address;

        return View();
    }

景色

<div>
    @using (Html.BeginForm())
    {
        <input type="text" name="name" id="name" />
        <input type="text" name="address" id="address"/>

        <input type="submit" name="submit" value="submit" />

         <input type="text" name="namedisplay" value='@ViewBag.Name'/>
        <input type="text" name="addressdisplay"  value='@ViewBag.Address'/>

    }
</div>

【讨论】:

  • 谢谢。你能解释一下,我应该在哪里保留视图,它的名称是什么,以及我的应用程序指定在哪里首先调用视图?对不起,我是新手。
猜你喜欢
  • 2020-08-26
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-02
  • 2012-06-21
  • 2011-06-02
  • 2016-10-14
相关资源
最近更新 更多