Частичное представление в частичном представлении не публикуется - PullRequest
3 голосов
/ 22 ноября 2011

Я все еще относительно новичок во всем способе работы с MVC, так что потерпите меня на этом.

В настоящее время я работаю над существующим веб-сайтом MVC, добавляя к нему функции администратора по мере необходимости.Существует один основной вид администратора.Все остальные операции CRUD обрабатываются частичными представлениями, загруженными в одно представление администратора.К этому моменту у меня не было проблем с добавлением всех этих частичных представлений.На данный момент есть две таблицы: Email_Queue и Smtp_Server.Бизнес-правила гласят, что у вас должна быть запись Smtp_Server, прежде чем вы сможете создать запись Email_Queue.

Поэтому, чтобы сделать ее более удобной для пользователя, у меня есть возможность создать Smtp_Server в представлении Создать частичное дляEmail_Queue.Я могу получить частичное представление Create для Smtp_Server, чтобы открыть в модальном всплывающем окне ... Я могу получить всю его проверку (установленную в модели) для запуска ... Я могу получить кнопку отмены, чтобы закрыть модальное всплывающее окно,Тем не менее, я не могу заставить кнопку отправки в частичном представлении Smtp_Server отправлять сообщения.

Конечная цель всего этого - в конечном итоге получить это сообщение, а затем выпустить раскрывающийся список в обновлении частичного представления Email_Queue сновый Smtp_server, который я только что добавил.Сейчас я был бы рад, если бы Smtp_Server просто сохранил то, что я ввожу.

Итак, вот код.Во-первых, частичное представление Email_Queue (я удалил дополнительные поля, чтобы оно было короче):

@model Models.Email_QueueModel

<div class="main_column_leftfull">
<!--=========Graph Box=========-->
<div class="box expose">
    <!-- A box with class of expose will call expose plugin automatically -->
    <div class="header">
        Create E-Mail Queue
    </div>
    <div class="body">
        <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
        <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
        <script type="text/javascript">

            function CancelAddSmtpServer() {
                var windowElement = $('#QueueCreate');
                windowElement.hide();
            }

            $(document).ready(function() {

            var windowElement = $('#QueueCreate');
            var undoButton = $('#opener-popup');
            undoButton
                .bind('click', function(e) {
                    windowElement.data('tWindow').open();
                    undoButton.hide();})
                .toggle(!windowElement.is(':visible'));
                    windowElement.bind('close', function() {
                    undoButton.show();

                });
            });

            function CloseWindow() {
                var windowElement = $('#QueueCreate').data('tWindow');
                windowElement.close();
            }

        </script>
        @using (Ajax.BeginForm("_Create", new AjaxOptions() { UpdateTargetId = "subForm", HttpMethod = "Post" }))
        {
            <fieldset>
                @Form.HiddenID("DepartmentId")
                <div class="editor-label">
                    @Html.LabelFor(model => model.QueueName)
                    @Html.EditorFor(model => model.QueueName, new { @class = "textfield" })
                    @Html.ValidationMessageFor(model => model.QueueName)
                </div>

                <div class="editor-label">
                    @Html.LabelFor(model => model.EmailServerConfig)
                    @Html.DropDownList("EmailServerConfig", "Select E-Mail Server Configuration...")
                    @Html.ValidationMessageFor(model => model.EmailServerConfig)
                </div>

                <div id="opener-popup" class="editor-label" style="cursor:pointer;">
                    Add SMTP Server
                </div>

                <div id="popup_content" title="Popup Title" style="display:none;">
                    @Html.Partial("../Email_SmtpServer/_QueueCreate")
                </div>

                @(Html.Telerik().Window()
                    .Name("QueueCreate")
                    .Modal(true)
                    .Title("Add SMTP Server")
                    .Scrollable(false)
                    .Draggable(true)
                    .Resizable()
                    .Visible(false)
                    .Content
                    (
                        @<text>
                            @Html.Partial("../Email_SmtpServer/_QueueCreate", new DATEL.MM.Models.Email_SmtpServerModel())
                        </text>
                    )
                )

                <br />
                <p>
                    @Form.Submit(value: "Create E-Mail Queue")
                   <input id="btnCancelEmail_QueueCreate" type="button" value="Cancel" class="button" />
                </p>
            </fieldset>
        }
        <div>
            @Html.ActionLink("Back to List", "Index")
        </div>
    </div>
</div>

Затем, частичное представление, которое я создал для модального всплывающего окна:

@model Models.Email_SmtpServerModel

<div class="main_column_leftfull">
<!--=========Graph Box=========-->
<div class="box expose">
    <!-- A box with class of expose will call expose plugin automatically -->
    <div class="header">
        Create SMTP Server
    </div>
    <div class="body">
        <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
        <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>


        @using (Ajax.BeginForm("_QueueCreate", new AjaxOptions() { UpdateTargetId = "subForm", HttpMethod = "Post" }))
        {
            <fieldset>
                @Form.HiddenID("SMTPServerId")
                <div class="editor-label">
                    @Html.LabelFor(model => model.ServerName)
                    @Html.EditorFor(model => model.ServerName, new { @class = "textfield" })
                    @Html.ValidationMessageFor(model => model.ServerName)
                </div>

                <div class="editor-label">
                    @Html.LabelFor(model => model.ServerDesc)
                    @Html.EditorFor(model => model.ServerDesc, new { @class = "textfield" })
                    @Html.ValidationMessageFor(model => model.ServerDesc)
                </div>

                <br />
                <p>
                    @Form.Submit(value: "Create SMTP Server")

                    <input id="btnCancelEmail_SmtpServerQueueCreate" type="button" value="Cancel" class="button" onclick="CloseWindow();" />
                </p>
            </fieldset>
        }
    </div>
</div>

И, наконец, вот мой код контроллера для _QueueCreate:

[HttpPost]
    public virtual PartialViewResult _QueueCreate(Email_SmtpServerModel model, FormCollection fc)
    {
        ViewBag.HasError = "none";
        try
        {
            string errorMessage = "";
            BusinessLogic.Email_SmtpServer dbESS = new BusinessLogic.Email_SmtpServer(AppManager.GetUser(User.Identity.Name).ConnectionString);
            model.SMTPServerId = System.Guid.NewGuid();
            model.CreatedDateGMT = DateTime.Now;
            model.CreatedUserId = AppManager.GetUser(User.Identity.Name).UserId;

            if (dbESS.Insert(model, out errorMessage))
            {
                ModelState.AddModelError("", errorMessage);
            }
            else
            {
                ViewBag.HasError = "none";
                return PartialView("../Email_Queue/_Create");
            }
        }
        catch
        {
            ViewBag.HasError = "true";
            return PartialView("../Email_Queue/_Create");
        }
        return PartialView(model);
    }

Если мне нужно опубликовать больше кода, сообщите мне.

TL; DR версия: Ну, просто посмотрите на заголовок.

1 Ответ

1 голос
/ 28 ноября 2011

не могли бы вы принудительно заставить кнопку отправки при клике

<input type="submit" name="btnSubmit" value="Submit Form" onclick="this.form.submit()" />

Или просто используйте jQuery для поиска по клику, а затем отправьте сообщение, используя ajax

$('input[name="btnSubmit"').click(function() {
//you will need to get form variables

$.ajax({
type:"POST",
data: { id = var1, parameter = var2 }
datatype: "json",
success: function (data){
//whatever needs done
},
error: function(){
alert("error");
}

});

MVC контроллер

public jsonresult somename(string id, string parameter)
{ 
return Json("SUCCESS");
}

или

public jsonresult somename(FormCollection fc)
{
strind id = fc["id"];
string parameter = fc["parameter"];
return Json("SUCCESS");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...