我是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处更改什么?
感谢。
答案 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" />
}