单独的URL ID和HttpPost

时间:2017-10-24 13:04:43

标签: c# asp.net model-view-controller

是否可以将URL(Home / Index / 10 )中的ID与使用HttpPost的表单提交分开并将其传递给控制器​​?

进一步解释

代码示例可能是:

[HttpPost]
public ActionResult Index(int id, CustomerInfo info)
{
    /*
     * Code
     */

    Return View();
}

CustomerInfo是一个对象,在这种情况下将包含一个名为“ID”的int和其他与客户相关的信息。

如果我提交表单并希望传递CustomerInfo ID和url参数id,则url id和CustomerInfo.id将是我从表单传递的CustomerInfo id。如果我没有传递CustomerInfo ID,则它们都是url参数id。

只需查看控制器中的url id就不是一个选项,因为我需要检查是否在CustomerInfo中给出了ID。

我知道我可以给CustomerInfo ID另一个名字(例如CustomerInfoID),但是想知道我是否可以保持url参数id和CustomerInfo ID的名称相同。

enter image description here

在上图中,您会看到我的问题。我没有为CustomerInfo.ID提供ID。当我提交表单时,它只是从url参数id传递给它。我希望当我不提供CustomerInfo的ID时,它是空的。

1 个答案:

答案 0 :(得分:1)

如果你想通过建立一个view-model来发送你需要的两件事,那么:

CustomerInfo

将此视频发送到您的视图,而不是 [HttpGet] public ActionResult Index() { ViewModel vm = new ViewModel() { info = info, id = 0 } return View(vm); //changed from below: //return View(info); }

CustomerInfo

您的视图中引用@Html.TextBoxFor(t => t.InfoText) 的任何内容现在通过视图模型执行此操作,例如:

@Html.TextBoxFor(t => t.info.InfoText)
...

现在是

[HttpPost]
public ActionResult Index(ViewModel viewModel)
{

    /*
     * Code
     */
    int id = viewModel.id;
    CustomerInfo info = viewModel.info;
    Return View();
}

在你的帖子论证中接受它:

public class TableHeaderWithInput extends Application {
    TableView<Locale> table;

    protected void installHeaderHandler(Observable s) {
        table.addEventFilter(MouseEvent.MOUSE_PRESSED, e -> {
            if (e.isPrimaryButtonDown() &&  e.getClickCount() > 1) {
                EventTarget target = e.getTarget();
                TableColumnBase<?, ?> column = null;
                while (target instanceof Node) {
                    target = ((Node) target).getParent();
                    // beware: package of TableColumnHeader is version specific
                    if (target instanceof TableColumnHeader) {
                        column = ((TableColumnHeader) target).getTableColumn();
                        if (column != null) break;
                    }
                }
                if (column != null) {
                    TableColumnBase<?,?> tableColumn = column;
                    TextField textField = new TextField(column.getText());
                    textField.setMaxWidth(column.getWidth());
                    textField.setOnAction(a -> {
                        tableColumn.setText(textField.getText());
                        tableColumn.setGraphic(null);
                    });
                    textField.focusedProperty().addListener((src, ov, nv) -> {
                        if (!nv) tableColumn.setGraphic(null);
                    });
                    column.setGraphic(textField);
                    textField.requestFocus();
                }
                e.consume();
            }
        });
    }

    private Parent getContent() {
        table = new TableView<>(FXCollections.observableArrayList(
                Locale.getAvailableLocales()));
        table.setTableMenuButtonVisible(true);
        // quick hack: don't let sorting interfere ...
        table.setSortPolicy(e -> {return false;});
        TableColumn<Locale, String> countryCode = new TableColumn<>("CountryCode");
        countryCode.setCellValueFactory(new PropertyValueFactory<>("country"));
        TableColumn<Locale, String> language = new TableColumn<>("Language");
        language.setCellValueFactory(new PropertyValueFactory<>("language"));
        table.getColumns().addAll(countryCode, language);
        table.skinProperty().addListener(this::installHeaderHandler);
        BorderPane pane = new BorderPane(table);
        return pane;
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setScene(new Scene(getContent(), 800, 400));
        primaryStage.setTitle(FXUtils.version());
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

    @SuppressWarnings("unused")
    private static final Logger LOG = Logger
            .getLogger(TableHeaderWithInput.class.getName());
}