Javascript MVC部分视图解耦示例代码
在我当前的MVC项目中,我有一个视图,它的功能太多,已经变得难以管理。为了解决这个问题,我开始向部分视图添加功能性,并将它们包含在视图中,但即使这样,这也是一个问题,因为底层javascript(jquery)是如此相互关联和相互缠绕,以至于它仍然是一团混乱。一个部分视图中的JS将在另一个部分视图中调用刷新方法,并创建一个临时耦合的灾难 我决定,我需要一种方法,将平行视图彼此分离,并与容器视图分离 这里是我的一些物品Javascript MVC部分视图解耦示例代码,javascript,jquery,asp.net-mvc,partial-views,Javascript,Jquery,Asp.net Mvc,Partial Views,在我当前的MVC项目中,我有一个视图,它的功能太多,已经变得难以管理。为了解决这个问题,我开始向部分视图添加功能性,并将它们包含在视图中,但即使这样,这也是一个问题,因为底层javascript(jquery)是如此相互关联和相互缠绕,以至于它仍然是一团混乱。一个部分视图中的JS将在另一个部分视图中调用刷新方法,并创建一个临时耦合的灾难 我决定,我需要一种方法,将平行视图彼此分离,并与容器视图分离 这里是我的一些物品 在我的部分视图中解耦JS,这样一个视图就不需要知道关于另一个视图或容器视图的任
namespace EngA.SandboxApplication.Controllers
{
public class PartialViewDecoupleController : Controller
{
// GET: PartialViewDecouple
public ActionResult Index()
{
return View();
}
public PartialViewResult IndexJs()
{
return PartialView();
}
public PartialViewResult MenuPartialView()
{
return PartialView();
}
public PartialViewResult MenuPartialViewJs()
{
return PartialView();
}
public PartialViewResult DisplayPartialView()
{
return PartialView();
}
public PartialViewResult DisplayPartialViewJs()
{
return PartialView();
}
}
}
索引视图只加载所有视图
Index.cshtml
@Html.Hidden("id")
@Html.Action("IndexJs", "PartialViewDecouple")
@Html.Action("MenuPartialView","PartialViewDecouple")
@Html.Action("MenuPartialViewJs", "PartialViewDecouple")
<br/>
<br/>
@Html.Action("DisplayPartialView", "PartialViewDecouple")
@Html.Action("DisplayPartialViewJs", "PartialViewDecouple")
@Html.Hidden(“id”)
@Action(“IndexJs”、“PartialViewDecouple”)
@Action(“MenuPartialView”、“PartialViewDecouple”)
@Action(“MenuPartialViewJs”、“PartialViewDecouple”)
@Action(“DisplayPartialView”、“PartialViewDecouple”)
@Action(“DisplayPartialViewJs”,“PartialViewDecouple”)
IndesJs文件将事件处理程序连接起来,并将partail视图结合在一起。IndexJs.cshtml
<script language="javascript">
$(document).ready(function () {
//Set up Event Handlers
$(document).bind("MenuPartialView_onClick", function (e, p1) {
$("#id").val(p1);
displayPartialView.setup(p1);
});
$(document).bind("DisplayPartialView_onClick", function (e, message) {
menuPartialView.message(message);
});
//Initialize Partial Views on refresh
var id = $("#id").val();
if (id!=null) displayPartialView.setup(id);
});
</script>
$(文档).ready(函数(){
//设置事件处理程序
$(document).bind(“MenuPartialView_onClick”),函数(e,p1){
$(“#id”).val(p1);
显示部分视图设置(p1);
});
$(文档).bind(“DisplayPartialView_onClick”),函数(e,消息){
menuPartialView.message(消息);
});
//刷新时初始化部分视图
var id=$(“#id”).val();
如果(id!=null)显示PartialView.setup(id);
});
只是一个接收数据的容器和一个引发事件的按钮
DisplayPartialView.cshtml
DisplayParitalView<br/>
<div id="display">default</div>
<input type="button" name="ButtonSayHi" id="ButtonSayHi" value="Say Hi" onclick="displayPartialView.onButtonSayHiClick(this)" />
MenuParitalView
<br/>
<input type="button" name="ButtonOne" value="One" onclick="menuPartialView.onButtonOneClick(this)" />
<input type="button" name="ButtonTwo" value="Two" onclick="menuPartialView.onButtonTwoClick(this)" />
DisplayParitalView
违约
下面,“设置”显示传递给它的参数。
“onButtonSayHiClick”引发和事件
DisplayPartialViewJs.cshtml
<script language="javascript">
var displayPartialView = {
setup: function (id) {
$("#display").html(id);
},
onButtonSayHiClick: function (e) {
var name = e.id;
$(document).trigger("DisplayPartialView_onClick", [name]);
}\
};
</script>
var displayPartialView={
设置:功能(id){
$(“#display”).html(id);
},
onButtonSayHiClick:函数(e){
变量名称=e.id;
$(document).trigger(“DisplayPartialView_onClick”,[name]);
}\
};
下面是两个支点,以引发事件。
MenuPartialView.cshtml
DisplayParitalView<br/>
<div id="display">default</div>
<input type="button" name="ButtonSayHi" id="ButtonSayHi" value="Say Hi" onclick="displayPartialView.onButtonSayHiClick(this)" />
MenuParitalView
<br/>
<input type="button" name="ButtonOne" value="One" onclick="menuPartialView.onButtonOneClick(this)" />
<input type="button" name="ButtonTwo" value="Two" onclick="menuPartialView.onButtonTwoClick(this)" />
MenuParitalView
下面,触发器引发事件并显示发送给它的消息。
MenuPartialViewJs.cshtml
<script language="javascript">
var menuPartialView = {
onButtonOneClick: function () {
$(document).trigger("MenuPartialView_onClick", [1]);
},
onButtonTwoClick: function () {
$(document).trigger("MenuPartialView_onClick", [2]);
},
message: function (message) {
alert("Message: " + message);
}
};
</script>
var menuPartialView={
onButtonOneClick:函数(){
$(document).trigger(“MenuPartialView_onClick”[1]);
},
OnButtonWoClick:函数(){
$(document).trigger(“MenuPartialView_onClick”[2]);
},
消息:函数(消息){
警报(“消息:+消息”);
}
};
如果你有更好的方法来完成同样的事情,请告诉我
多谢各位
Earl首先,将脚本直接添加到HTML中不是一个好主意-将它们放在单独的js文件中,然后进行捆绑/缩小。这将节省页面加载时间,并使其更易于维护 一个好的方法是通过“视图”来分隔HTML——基本上,用ID将每个视图包装在一个div中,例如
<div id="my-app-view-1">VIEW HTML</div>
这将确保您拥有模块化js,并且其他脚本不会干扰此视图。首先,将脚本直接添加到HTML中不是一个好主意-将它们放在单独的js文件中,然后进行捆绑/缩小。这将节省页面加载时间,并使其更易于维护 一个好的方法是通过“视图”来分隔HTML——基本上,用ID将每个视图包装在一个div中,例如
<div id="my-app-view-1">VIEW HTML</div>
这将确保您拥有模块化的js,并且其他脚本不会干扰此视图。您是否考虑过将Asp.Net MVC与javascript MVC框架相结合?我发现Aurelia非常擅长分离模块,但我相信angular和reactjs以及其他许多模块都可以从中受益。您必须让他们通过api与服务器端通信,但这并不难设置。您是否考虑过将Asp.Net MVC与javascript MVC框架相结合?我发现Aurelia非常擅长分离模块,但我相信angular和reactjs以及其他许多模块都可以从中受益。您必须让它们通过api与服务器端通信,但这并不难设置。