Внутри все это делается через HTML. Я бы предложил использовать javascript.
Иметь один элемент div с таким идентификатором, как
<div id="InterchangableView"></div>
Добавить событие onChange в раскрывающийся список и передать функции javascript значение dropdown
В функции определите, какое это значение, и вызовите необходимый метод контроллера, например, ниже
if(id == 1)
{
var json = '{controllerParam: ' + id + '}';
$.ajax({
url:'@Url.Action("Action", "Controller")',
type:'POST',
data: json,
contentType:'Application/json',
success:fucntion(result){
$("#InterchangableView").html(result);
}
});
}
В действии контроллера, в зависимости от переданного в него результата, сделайте проверку и верните правильное частичное представление таким образом.
Каждый раз, когда выпадающий список изменяется, должен вызываться javascript, который должен возвращать частичный вид, который должен перезаписывать все, что находится в div, на котором расположен этот Id.
Просто возвратите другой класс, который возвратит $this для каждого названного метода.
Пример:
class NoMethods {
public function __call($name, $args)
{
echo __METHOD__ . " called $name with " . count($args) . " arguments.\n";
return $this;
}
}
class Browser {
public function runThis()
{
echo __METHOD__ . "\n";
return $this;
}
public function stop()
{
echo __METHOD__ . "\n";
return new NoMethods();
}
public function dontRunThis()
{
echo __METHOD__ . "\n";
return $this;
}
}
$browser = new Browser();
echo "with stop\n";
$browser->runThis()->stop()->dontRunThis()->dunno('hey');
echo "without stop\n";
$browser->runThis()->dontRunThis();
echo "the end\n";
Приведет к:
with stop
Browser::runThis
Browser::stop
NoMethods::__call called dontRunThis with 0 arguments.
NoMethods::__call called dunno with 1 arguments.
without stop
Browser::runThis
Browser::dontRunThis
the end
Вы могли использовать исключения PHP:
// This function would of course be declared in the class
function stop() {
throw new Exception('Stopped.');
}
try {
$browser->isStatusCode(200)
->isRequestParameter('module', 'home')
->isRequestParameter('action', 'index')
->click('Register')
->stop()
->I_DONT_WANT_THIS_TO_RUN();
} catch (Exception $e) {
// when stop() throws the exception, control will go on from here.
}
$browser->thenThisRunsOkay();
Ответ OI действительно хорош, хотя я видел, что это могло бы стать сбивающим с толку, если объект внезапно изменяется на что-то еще. Таким образом, Вы ожидали бы, что в конце Вашей цепочки, закончите с тем же объектом. Избегать, чтобы проблема, я добавил бы частную переменную для сообщения класса, сделать ли на самом деле что-нибудь. Если класс был остановлен, то каждый класс просто возвращается $this
немедленно. Это приносит Вам дополнительную пользу способности перезапустить выполнение.
class MyClass {
private $halt;
function __call($func, $args) {
if ($this->halt) {
return $this;
} else {
return $this->$func($args);
}
}
private function isRequestParameter() {
// ...
}
public function stop() {
$this->halt = true;
}
public function start() {
$this->halt = false;
}
}
Это могло быть помещено в родительский класс, таким образом, Вы не должны копировать этот код.