В моем текущем проекте MVC у меня есть один вид с такой большой функциональностью, которая стала неуправляемой. Чтобы решить эту проблему, я начал добавлять funtionality к частичным представлениям и включать их в представление, но даже это было проблемой, потому что базовый javascript (jquery) был настолько взаимосвязан и переплетался, что все еще был беспорядок. JS в одном частичном представлении вызовет метод обновления в другом частичном представлении и создаст катастрофически связанную катастрофу.MVC Partial View Decoupling Пример кода
Я решил, что мне нужен способ разграничения взглядов на паралтон друг от друга и из вида контейнера.
Вот некоторые из моих объектов
отвязать JS в моих parital взглядов, так что один вид не нужно ничего знать о другой точке зрения или мнение контейнера.
Пространства имен JS-кода для каждого представления, чтобы я не запускал конфликты между представлениями.
Создайте шаблон для maintian состояния на обновления страницы (или ссылку на эту страницу)
Put JS в Sperate файлы, которые по-прежнему поддерживает бритву для разрешения URL и другие функции с одним JS-файла на представление или частичное Посмотреть.
Использовать соглашения об именах, которые позволяют кому-то, кто смотрит на контейнерный вид, подключать проводку и код инициализации, чтобы понять, что происходит и где ссылаются ссылки.
Уметь передавать данные параметров из события триггера слушателям.
После того, как вы провели некоторое исследование и не нашли много информации об этом, я создал небольшую демонстрацию, которая показывает мой первый подход к решению этой проблемы. Я надеюсь, что другие смогут увидеть, что я делаю, и предоставить еще более эффективные способы решения этой задачи. В демонстрации есть два частичных представления, которые общаются друг с другом, ничего не зная о достижении другого. Вид contianing используется для подключения обработчиков событий и вызова функций при возникновении события.
Вот демо-код
Контроллер не делает ничего, но возвращает вид и частичный вид.
PartialViewDecoupleController.cs
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")
The 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>
Просто контейнер, чтобы получать данные и кнопку, чтобы вызвать событие.
DisplayPartialView.cshtml
DisplayParitalView<br/>
<div id="display">default</div>
<input type="button" name="ButtonSayHi" id="ButtonSayHi" value="Say Hi" onclick="displayPartialView.onButtonSayHiClick(this)" />
Внизу «setup» отображается передаваемый ему параметр. "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>
Ниже два buttens поднять события. MenuPartialView.cshtml
MenuParitalView
<br/>
<input type="button" name="ButtonOne" value="One" onclick="menuPartialView.onButtonOneClick(this)" />
<input type="button" name="ButtonTwo" value="Two" onclick="menuPartialView.onButtonTwoClick(this)" />
Ниже Триггеры поднять события и сообщение отображается сообщение, которое посылается на него. 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>
пожалуйста, дайте мне знать, если вы видите, лучшие способы достижения то же самое
Спасибо
Эрла
Вы считали объединение Asp.Net MVC с фреймворком mvc javascript? Я обнаружил, что Aurelia очень хорошо разбирается в модулях, но я уверен, что угловые и реагирующие, как и многие другие, могут быть полезны. Вы должны позволить им общаться с вашей серверной стороной через api, но это не так сложно настроить. – Peter