MVC - 如何在按钮点击时简单地做某事?

时间:2013-12-10 16:17:30

标签: asp.net-mvc asp.net-mvc-4

我是ASP.NET MVC的新手。我习惯只用ASP.NET编程。我想在用户点击按钮时做一些事情。我不知道我在Controller做什么。

我有这个观点:

@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}
@Html.Action("RegisterHour", "Register")

和控制器:

public ActionResult RegisterHour()
    {
        //TODO: do anything

        return View("Index");
    }

当我点击按钮时,我想留在同一页面(它可以重新加载)。我只是想做一些事情,比如去数据库并创建一个新实体,然后显示一个消息框。

此代码导致堆栈溢出。我错过了什么?我需要在Controller处更改什么?

感谢。

4 个答案:

答案 0 :(得分:2)

该行

@Html.Action("RegisterHour", "Register")

实际上向服务器发出请求以呈现“RegisterHour”操作的结果。因此,为了第一次呈现操作的结果,您需要向同一操作发出请求。这会导致无限循环,因此堆栈溢出。

您正在考虑事件,而不是考虑HTTP和Web。

ASP.NET MVC包含HTTP协议,您必须知道在发出请求时会发生什么以及如何呈现HTML。

如果要实现您描述的方案,则必须在页面上放置一个表单。该按钮可以通过对其他某个操作发出POST请求来提交该表单,然后该操作可以呈现显示结果的视图。但是,为了简单地显示一个消息框,我认为这不是一个好主意。

这是桌面应用的工作方式,而不是网络应用。你试图通过一个圆孔安装一个方形钉。

答案 1 :(得分:0)

创建一个端点并将表单提交给它。

用户界面代码

<form action="/Registration/RegisterHour" >

<p>
    <label>Username</label>
    <input type="text" name="username" />
</p>

<p>
    <label>First Name</label>
    <input type="text" name="firstname" />
</p>

<p>
    <label>Last Name</label>
    <input type="text" name="lastname" />
</p>

<p>
    <label>Password</label>
    <input type="text" name="password" />
</p>

<p>
    <label>Confirm</label>
    <input type="text" name="confirm" />
</p>

<input type="submit" value="Save" />
</form>

<强>模型

public class Registration
{
    public string Username {get; set;}

    public string FirstName {get; set;}

    public string LastName {get; set;}

    public string Password {get; set;}

    public string Confirm {get; set;}
}

通常,您将拥有两个相同的端点,一个用于获取,另一个用于帖子。

public class RegistrationController : Controller
{

    //Get
    [HttpGet]
    public ActionResult RegisterHour()
    {
      //TODO: do anything

      return View("Index");
    }


    //Post
    [HttpPost]
    public ActionResult RegisterHour(Registration newUser)
    {   
        if(Model.IsValid)
        {
            //Save user to the database
            userRepository.AddUser(newUser);

            //load success screen.
            return RedirectAction("SuccessfulRegistration");
        }

        //If Model is invalid handle error on the client.
        return View("Index");
    }

}

答案 2 :(得分:0)

有很多方法可以回到控制器。没有回帖查看ajax调用。最简单的方法是回发。将您的视图放在表单标记中html或html.beginform

@using (Html.BeginForm()){
    <input type="submit" value="submit"/>
}

正如@Chuck在你的控制器上提到的,然后有一个与你显示的同名的post方法

[HttpPost]
public ActionResult RegisterHour()
{
    //TODO: do anything

    return View(model);
}

你拥有的@ Html.Action将返回一个url,以便放入另一个元素中。

之类的东西
<a src="@Html.Action("Action", "Controller")">Click Here</a>

答案 3 :(得分:0)

如果你想留在同一页而不是

return View("index");

使用

return View();

编辑:

如果你想在这里做一些完整的代码,你就是:

模型

public ActionResult MyModel()
{
    [Required]
    public int propriety1 { get; set; }
}

控制器

public ActionResult DoSomething()
{
    var model = new MyModel();
    return View(model);
}

[HttpPost]
public ActionResult DoSomething(MyModel model)
{
    if(ModelState.isValid){
        //DO something
    }else{
    return View(model);
    }
}

查看

@model Models.MyModel

@using (Html.BeginForm())
{
@Html.LaberlFor(m=>m.propriety1) @Html.TextBoxFor(m=>m.propriety1)
<input type="submit" value="Click me" />
}