2017-06-06 63 views
0

我构建表单的方式是有多个“测试连接”提交按钮和一个“保存”提交按钮,以保存每个测试连接的所有凭据和URL。我看到了一些建议的解决方案,但我不想做一个Ajax或JavaScript。所以我想知道这是否可能。顺便说一下,我想通过提交按钮将值作为枚举值传递给控制器​​,并在控制器中接收该枚举。多个提交按钮与从按钮传递的值

我可以很容易地做出多个ActionResults,但它对我来说只是感觉如此复杂,如果我必须改变测试连接中的某些东西,我将不得不改变所有。所以我想在同一个表单中只有一个TestConnection的ActionResult方法和一个Save ActionResult。

当我点击保存按钮时,所有凭证都将作为ApplicationSettings模型发送到控制器。

当我单击测试连接按钮时,我仍然收到ApplicationSettings模型加上DatabaseSystems枚举,并根据接收到的按钮的枚举,我会做必要的连接。

下面是代码片段,但我不能让它们工作。

尝试的方法: 1.空白表单动作,提交按钮的名称相应地为“Save”和“TestConnection”。 - 保存作品。 TestConnection不起作用说无法找到资源。 2.表单操作指向“TestConnection”,TestConnection按钮名称设置为 “database”,值设置为@ DatabaseSystems.xxx,Save按钮设置为“action:Save”,添加Action的ActionResult方法[MultipleButton(Name = "action", Argument = "Save")] - TestConnection工作,保存不起作用的含糊不清的要求。

我似乎无法弄清楚配置,使他们都工作。 :(

查看

@using Models.Enums 
@model MyApp.Data.ApplicationSettings 

@Html.AntiForgeryToken() 
@using (Html.BeginForm()) 
{ 
<div class="row"> 
    <div class="col-md-2"> 
     @Html.EditorFor(model => model.con1_un, new { htmlAttributes = new { @class = "form-control", @placeholder = Html.DisplayNameFor(model => model.con1_un) } }) 
    </div> 
    <div class="col-md-2"> 
     @Html.EditorFor(model => model.con1_pw, new { htmlAttributes = new { @class = "form-control", @placeholder = Html.DisplayNameFor(model => model.con1_pw) } }) 
    </div> 
    <div class="col-md-7"> 
     @Html.EditorFor(model => model.con1_url, new { htmlAttributes = new { @class = "form-control", @placeholder = Html.DisplayNameFor(model => model.con1_url), @rows = "1", @style = "max-width:520px !important" } }) 
    </div> 
    <div class="col-md-1 pull-right"> 
     <button type="submit" class="btn btn-warning pull-right" name="database" value="@DatabaseSystems.System1" data-toggle="collapse" data-target="#loading"><span class="glyphicon glyphicon-link"></span> Test Connection</button> 
    </div> 
</div> 
<div class="row"> 
    <div class="col-md-2"> 
     @Html.EditorFor(model => model.con2_un, new { htmlAttributes = new { @class = "form-control", @placeholder = Html.DisplayNameFor(model => model.con2_un) } }) 
    </div> 
    <div class="col-md-2"> 
     @Html.EditorFor(model => model.con2_pw, new { htmlAttributes = new { @class = "form-control", @placeholder = Html.DisplayNameFor(model => model.con2_pw) } }) 
    </div> 
    <div class="col-md-7"> 
     @Html.EditorFor(model => model.con2_url, new { htmlAttributes = new { @class = "form-control", @placeholder = Html.DisplayNameFor(model => model.con2_url), @rows = "1", @style = "max-width:520px !important" } }) 
    </div> 
    <div class="col-md-1 pull-right"> 
     <button type="submit" class="btn btn-warning pull-right" name="database" value="@DatabaseSystems.System2" data-toggle="collapse" data-target="#loading"><span class="glyphicon glyphicon-link"></span> Test Connection</button> 
    </div> 
</div> 

<div class="row"> 
    <div class="col-md-2"> 
     @Html.EditorFor(model => model.con3_un, new { htmlAttributes = new { @class = "form-control", @placeholder = Html.DisplayNameFor(model => model.con3_un) } }) 
    </div> 
    <div class="col-md-2"> 
     @Html.EditorFor(model => model.con3_pw, new { htmlAttributes = new { @class = "form-control", @placeholder = Html.DisplayNameFor(model => model.con3_pw) } }) 
    </div> 
    <div class="col-md-7"> 
     @Html.EditorFor(model => model.con3_url, new { htmlAttributes = new { @class = "form-control", @placeholder = Html.DisplayNameFor(model => model.con3_url), @rows = "1", @style = "max-width:520px !important" } }) 
    </div> 
    <div class="col-md-1 pull-right"> 
     <button type="submit" class="btn btn-warning pull-right" name="database" value="@DatabaseSystems.System3" data-toggle="collapse" data-target="#loading"><span class="glyphicon glyphicon-link"></span> Test Connection</button> 
    </div> 
</div> 

... and many more test connections for different systems 

<button type="submit" class="btn btn-success pull-right" name="Save" data-toggle="collapse" data-target="#loading"><span class="glyphicon glyphicon-floppy-disk"></span> Save</button> 
} 

控制器

[HttpPost] 
ActionResult TestConnection(ApplicationSettings model, DatabaseSystems database) 
{ 
    // depending on the DatabaseSystems enum passed, then I'll do the necessary connection check. 
{ 
[HttpPost] 
ActionResult Save(ApplicationSettings model) 
{ 
    // Save credentials entered in all the input fields above for con1, con2 & con3. 
} 

型号

[Serializable] 
public class ApplicationSettings 
{ 
    public string con1_un { get; set; } 
    public string con1_pw { get; set; } 
    public string con1_url { get; set; } 

    public string con2_un { get; set; } 
    public string con2_pw { get; set; } 
    public string con2_url { get; set; } 

    public string con3_un { get; set; } 
    public string con3_pw { get; set; } 
    public string con3_url { get; set; } 

    ... and many more systems 
} 

恩UM与多个不同的参数

public enum DatabaseSystems 
{ 
    System1, 
    System2, 
    System3, 
    ... and many more systems 
} 
+0

那你有什么问题? –

+0

你是什么意思_无需妥协other_?而你有'@using(Html.BeginForm())'这意味着你的形式将提交回POST方法具有相同的名称为GET方法(你没有说是什么) - 你会需要一点一个javascript回发到单独的方法(虽然它不清楚为什么你需要单独的方法) –

+0

@Stephen Muecke,更新后。 – leahsaif

回答

0

终于明白了。虽然@Stephen Muecke并没有真正提供直接的解决方案,但我应该说他让我重新考虑再次使用形式,所以我仍然要感谢他。谢了哥们!下面是我如何解决它:

查看

@using Models.Enums 
@model MyApp.Data.ApplicationSettings 

@Html.AntiForgeryToken() 
@using (Html.BeginForm()) 
{ 
    ... 
    <button type="submit" class="btn btn-warning pull-right" name="database" value="@DatabaseSystems.System1" formaction="Admin/TestConnection" data-toggle="collapse" data-target="#loading"><span class="glyphicon glyphicon-link"></span> Test Connection</button> 
    ... 
    <button type="submit" class="btn btn-warning pull-right" name="database" value="@DatabaseSystems.System2" formaction="Admin/TestConnection" data-toggle="collapse" data-target="#loading"><span class="glyphicon glyphicon-link"></span> Test Connection</button> 
} 

控制器

public ActionResult TestConnection(ApplicationSettings model, DatabaseSystems database) 
{ 
    // at the end, instead of putting return View() or return("Index", model), I used below code 
    return Redirect("/[ControllerName]"); 
{ 

......这样一来,formaction会做的ActionResult方法的调用对我来说,同时保持该按钮的name属性可用于其他用途,例如将其作为参数传递给我的TestConnection方法。

0

使用单一的动作名称提交给button.and的名字是在这两个按钮相同,但其值不同

进行检查connectin

<button type="submit" class="btn btn-warning pull-right" name="save" value="@DatabaseSystems.System3" data-toggle="collapse" data-target="#loading"><span class="glyphicon glyphicon-link"></span> Test Connection</button> 

用于保存

<button type="submit" class="btn btn-warning pull-right" name="Save" value="save" data-toggle="collapse" data-target="#loading"><span class="glyphicon glyphicon-link"></span> Save</button> 


    [HttpPost] 
    ActionResult Save(ApplicationSettings model,string Save) 
       { 
    if(Save=="Testconnection") 
    { 
    //do your code on save 
    } 
    if(save="Save") 
    { 
    //do your code on save 
    } 
     } 
+0

恐怕这一个不工作了队友。控制器不能识别哪个方法正在被调用。 – leahsaif

+0

我修改了我的答案,请检查。 – NIts577

+0

@ Nlts577,感谢您的建议,但这正是我想要避免的。我想让MVC为我做分隔,而不是我做这样的代码。 :d – leahsaif